Repository: pterm/pterm (go)

Issue:
add `Printfln` and `Sprintfln` for all printers
Add `Printfln` and `Sprintfln` which formats the input and adds a "\n" at the end.

Pull request:
add `Sprintfln` and `Printfln` functions for all printers
### Description
Added `Sprintfln` and `Printfln` functions for all printers.

### Scope
> What is affected by this pull request?

- [ ] Bug Fix
- [x] New Feature
- [x] Documentation
- [ ] Other

### Related Issue
Fixes #191 


### To-Do Checklist
- [x] I tested my changes
- [x] I have commented every method that I created/changed
- [ ] I updated the examples to fit with my changes
- [x] I have added tests for my newly created methods


Patch:
diff --git a/basic_text_printer.go b/basic_text_printer.go
index 1a1bf7a0..9f21aa38 100644
--- a/basic_text_printer.go
+++ b/basic_text_printer.go
@@ -40,6 +40,12 @@ func (p BasicTextPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p BasicTextPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -65,3 +71,12 @@ func (p *BasicTextPrinter) Printf(format string, a ...interface{}) *TextPrinter
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p *BasicTextPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/box_printer.go b/box_printer.go
index 5ce1a37e..8a2501fb 100644
--- a/box_printer.go
+++ b/box_printer.go
@@ -166,6 +166,12 @@ func (p BoxPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p BoxPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -191,3 +197,12 @@ func (p BoxPrinter) Printf(format string, a ...interface{}) *TextPrinter {
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p BoxPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/center_printer.go b/center_printer.go
index 78adab1f..001f0514 100644
--- a/center_printer.go
+++ b/center_printer.go
@@ -66,6 +66,12 @@ func (p CenterPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p CenterPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -91,3 +97,12 @@ func (p CenterPrinter) Printf(format string, a ...interface{}) *TextPrinter {
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p CenterPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/color.go b/color.go
index 55663482..42851da5 100644
--- a/color.go
+++ b/color.go
@@ -163,6 +163,13 @@ func (c Color) Sprintf(format string, a ...interface{}) string {
 	return c.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+// Input will be colored with the parent Color.
+func (c Color) Sprintfln(format string, a ...interface{}) string {
+	return c.Sprint(Sprintf(format, a...) + "\n")
+}
+
 // Println formats using the default formats for its operands and writes to standard output.
 // Spaces are always added between operands and a newline is appended.
 // It returns the number of bytes written and any write error encountered.
@@ -192,6 +199,16 @@ func (c Color) Printf(format string, a ...interface{}) *TextPrinter {
 	return &tc
 }
 
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+// Input will be colored with the parent Color.
+func (c Color) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(c.Sprintfln(format, a...))
+	tp := TextPrinter(c)
+	return &tp
+}
+
 // String converts the color to a string. eg "35".
 func (c Color) String() string {
 	return fmt.Sprintf("%d", c)
@@ -244,6 +261,13 @@ func (s Style) Sprintf(format string, a ...interface{}) string {
 	return s.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+// Input will be colored with the parent Style.
+func (s Style) Sprintfln(format string, a ...interface{}) string {
+	return s.Sprint(Sprintf(format, a...) + "\n")
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -267,6 +291,14 @@ func (s Style) Printf(format string, a ...interface{}) {
 	Print(s.Sprintf(format, a...))
 }
 
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+// Input will be colored with the parent Style.
+func (s Style) Printfln(format string, a ...interface{}) {
+	Print(s.Sprintfln(format, a...))
+}
+
 // Code convert to code string. returns like "32;45;3".
 func (s Style) Code() string {
 	return s.String()
diff --git a/docs/contributing/writing-documentation-template.md b/docs/contributing/writing-documentation-template.md
index 3bb30f43..1b4a7651 100644
--- a/docs/contributing/writing-documentation-template.md
+++ b/docs/contributing/writing-documentation-template.md
@@ -53,9 +53,11 @@
     |Sprint(a ...interface{})|Returns a string|
     |Sprintln(a ...interface{})|Returns a string with a new line at the end|
     |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+    |Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
     |Print(a ...interface{})|Prints to the terminal|
     |Println(a ...interface{})|Prints to the terminal with a new line at the end|
     |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+    |Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
     -->
     
     <!--
diff --git a/docs/docs/functions.md b/docs/docs/functions.md
index bd916e76..e20b117b 100644
--- a/docs/docs/functions.md
+++ b/docs/docs/functions.md
@@ -13,6 +13,7 @@
 |-------------|-----------|
 |[Print](https://pkg.go.dev/github.com/pterm/pterm#Print)|Print formats using the default formats for its operands and writes to standard output. Spaces are added between operands when neither is a string. It returns the number of bytes written and any write error encountered.|
 |[Printf](https://pkg.go.dev/github.com/pterm/pterm#Printf)|Printf formats according to a format specifier and writes to standard output. It returns the number of bytes written and any write error encountered.|
+|[Printfln](https://pkg.go.dev/github.com/pterm/pterm#Printfln)|Printfln formats according to a format specifier and writes to standard output. It returns the number of bytes written and any write error encountered with a new line at the end.|
 |[Println](https://pkg.go.dev/github.com/pterm/pterm#Println)|Println formats using the default formats for its operands and writes to standard output. Spaces are always added between operands and a newline is appended. It returns the number of bytes written and any write error encountered.|
 |[Printo](https://pkg.go.dev/github.com/pterm/pterm#Printo)|Printo overrides the current line in a terminal. If the current line is empty, the text will be printed like with `pterm.Print`. Example: pterm.Printo("Hello, World") time.Sleep(time.Second) pterm.Printo("Hello, Earth!")|
 
diff --git a/docs/docs/printer/basictext.md b/docs/docs/printer/basictext.md
index 62c6ca40..67e02fc8 100644
--- a/docs/docs/printer/basictext.md
+++ b/docs/docs/printer/basictext.md
@@ -42,9 +42,11 @@ pterm.DefaultBasicText.Println("Hello, World!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/box.md b/docs/docs/printer/box.md
index 62237ad3..2ad5ce50 100644
--- a/docs/docs/printer/box.md
+++ b/docs/docs/printer/box.md
@@ -54,9 +54,11 @@ pterm.DefaultBox.Println("test")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/center.md b/docs/docs/printer/center.md
index 97c5e292..f806f79e 100644
--- a/docs/docs/printer/center.md
+++ b/docs/docs/printer/center.md
@@ -41,10 +41,11 @@ pterm.DefaultCenter.Println("Hello,\nWorld!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
-
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/color.md b/docs/docs/printer/color.md
index bea5cacb..2c69d555 100644
--- a/docs/docs/printer/color.md
+++ b/docs/docs/printer/color.md
@@ -47,9 +47,11 @@ pterm.FgLightWhite.Println("FgLightWhite")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/header.md b/docs/docs/printer/header.md
index f813e0d5..26a2b31b 100644
--- a/docs/docs/printer/header.md
+++ b/docs/docs/printer/header.md
@@ -46,9 +46,11 @@ pterm.DefaultHeader.Println("Hello, World!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/paragraph.md b/docs/docs/printer/paragraph.md
index 4ab8512b..ee7fa07f 100644
--- a/docs/docs/printer/paragraph.md
+++ b/docs/docs/printer/paragraph.md
@@ -42,9 +42,11 @@ pterm.DefaultParagraph.Println("Hello, World!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/prefix.md b/docs/docs/printer/prefix.md
index 83c5a97e..2648b747 100644
--- a/docs/docs/printer/prefix.md
+++ b/docs/docs/printer/prefix.md
@@ -71,9 +71,11 @@ pterm.Fatal.WithOptionName(option).WithOptionName2(option2).Println("Hello, Worl
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 
diff --git a/docs/docs/printer/rgb.md b/docs/docs/printer/rgb.md
index 17181b3e..4fa37e2d 100644
--- a/docs/docs/printer/rgb.md
+++ b/docs/docs/printer/rgb.md
@@ -36,9 +36,11 @@ pterm.NewRGB(178, 44, 199).Println("This text is printed with a custom RGB!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/section.md b/docs/docs/printer/section.md
index d3be1827..899f578d 100644
--- a/docs/docs/printer/section.md
+++ b/docs/docs/printer/section.md
@@ -46,9 +46,11 @@ pterm.DefaultSection.Println("Hello, World!")
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/docs/docs/printer/style.md b/docs/docs/printer/style.md
index b8ec4caa..b603bc9e 100644
--- a/docs/docs/printer/style.md
+++ b/docs/docs/printer/style.md
@@ -36,9 +36,11 @@ pterm.NewStyle(pterm.FgLightCyan, pterm.BgGray, pterm.Bold).Println("Hello, Worl
 |Sprint(a ...interface{})|Returns a string|
 |Sprintln(a ...interface{})|Returns a string with a new line at the end|
 |Sprintf(format string, a ...interface{})|Returns a string, formatted according to a format specifier|
+|Sprintfln(format string, a ...interface{})|Returns a string, formatted according to a format specifier with a new line at the end|
 |Print(a ...interface{})|Prints to the terminal|
 |Println(a ...interface{})|Prints to the terminal with a new line at the end|
 |Printf(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier|
+|Printfln(format string, a ...interface{})|Prints to the terminal, formatted according to a format specifier with a new line at the end|
 
 ## Related
 - [Override default printers](docs/customizing/override-default-printer.md)
\ No newline at end of file
diff --git a/header_printer.go b/header_printer.go
index e9059c84..6b343b69 100644
--- a/header_printer.go
+++ b/header_printer.go
@@ -91,6 +91,12 @@ func (p HeaderPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p HeaderPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -116,3 +122,12 @@ func (p *HeaderPrinter) Printf(format string, a ...interface{}) *TextPrinter {
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p *HeaderPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/interface_text_printer.go b/interface_text_printer.go
index 87c50138..ed347d51 100644
--- a/interface_text_printer.go
+++ b/interface_text_printer.go
@@ -13,6 +13,10 @@ type TextPrinter interface {
 	// Sprintf formats according to a format specifier and returns the resulting string.
 	Sprintf(format string, a ...interface{}) string
 
+	// Sprintfln formats according to a format specifier and returns the resulting string.
+	// Spaces are always added between operands and a newline is appended.
+	Sprintfln(format string, a ...interface{}) string
+
 	// Print formats using the default formats for its operands and writes to standard output.
 	// Spaces are added between operands when neither is a string.
 	// It returns the number of bytes written and any write error encountered.
@@ -26,4 +30,9 @@ type TextPrinter interface {
 	// Printf formats according to a format specifier and writes to standard output.
 	// It returns the number of bytes written and any write error encountered.
 	Printf(format string, a ...interface{}) *TextPrinter
+
+	// Printfln formats according to a format specifier and writes to standard output.
+	// Spaces are always added between operands and a newline is appended.
+	// It returns the number of bytes written and any write error encountered.
+	Printfln(format string, a ...interface{}) *TextPrinter
 }
diff --git a/paragraph_printer.go b/paragraph_printer.go
index e9b5e755..49844d14 100644
--- a/paragraph_printer.go
+++ b/paragraph_printer.go
@@ -55,6 +55,12 @@ func (p ParagraphPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p ParagraphPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -80,3 +86,12 @@ func (p *ParagraphPrinter) Printf(format string, a ...interface{}) *TextPrinter
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p *ParagraphPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/prefix_printer.go b/prefix_printer.go
index c8806da2..d310bf20 100644
--- a/prefix_printer.go
+++ b/prefix_printer.go
@@ -207,6 +207,12 @@ func (p PrefixPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p PrefixPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -245,6 +251,15 @@ func (p *PrefixPrinter) Printf(format string, a ...interface{}) *TextPrinter {
 	return &tp
 }
 
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p *PrefixPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
+
 // GetFormattedPrefix returns the Prefix as a styled text string.
 func (p PrefixPrinter) GetFormattedPrefix() string {
 	return p.Prefix.Style.Sprint(" " + p.Prefix.Text + " ")
diff --git a/print.go b/print.go
index 1acd6769..944fdc6f 100644
--- a/print.go
+++ b/print.go
@@ -24,6 +24,12 @@ func Sprintf(format string, a ...interface{}) string {
 	return color.Sprintf(format, a...)
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func Sprintfln(format string, a ...interface{}) string {
+	return color.Sprintf(format, a...) + "\n"
+}
+
 // Sprintln returns what Println would print to the terminal.
 func Sprintln(a ...interface{}) string {
 	str := fmt.Sprintln(a...)
@@ -74,6 +80,13 @@ func Printf(format string, a ...interface{}) {
 	Print(Sprintf(format, a...))
 }
 
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func Printfln(format string, a ...interface{}) {
+	Print(Sprintfln(format, a...))
+}
+
 // Fprint formats using the default formats for its operands and writes to w.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
diff --git a/rgb.go b/rgb.go
index 383a9f59..9a777c59 100644
--- a/rgb.go
+++ b/rgb.go
@@ -101,6 +101,12 @@ func (p RGB) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p RGB) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -126,3 +132,12 @@ func (p RGB) Printf(format string, a ...interface{}) *TextPrinter {
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p RGB) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}
diff --git a/section_printer.go b/section_printer.go
index 0b9adcb4..b5912a19 100644
--- a/section_printer.go
+++ b/section_printer.go
@@ -92,6 +92,12 @@ func (p SectionPrinter) Sprintf(format string, a ...interface{}) string {
 	return p.Sprint(Sprintf(format, a...))
 }
 
+// Sprintfln formats according to a format specifier and returns the resulting string.
+// Spaces are always added between operands and a newline is appended.
+func (p SectionPrinter) Sprintfln(format string, a ...interface{}) string {
+	return p.Sprintf(format, a...) + "\n"
+}
+
 // Print formats using the default formats for its operands and writes to standard output.
 // Spaces are added between operands when neither is a string.
 // It returns the number of bytes written and any write error encountered.
@@ -117,3 +123,12 @@ func (p *SectionPrinter) Printf(format string, a ...interface{}) *TextPrinter {
 	tp := TextPrinter(p)
 	return &tp
 }
+
+// Printfln formats according to a format specifier and writes to standard output.
+// Spaces are always added between operands and a newline is appended.
+// It returns the number of bytes written and any write error encountered.
+func (p *SectionPrinter) Printfln(format string, a ...interface{}) *TextPrinter {
+	Print(p.Sprintfln(format, a...))
+	tp := TextPrinter(p)
+	return &tp
+}


Test patch:
diff --git a/basic_text_printer_test.go b/basic_text_printer_test.go
index 785596a2..42384293 100644
--- a/basic_text_printer_test.go
+++ b/basic_text_printer_test.go
@@ -28,6 +28,12 @@ func TestBasicTextPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -46,6 +52,12 @@ func TestBasicTextPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/box_printer_test.go b/box_printer_test.go
index f0f36638..6594fdb3 100644
--- a/box_printer_test.go
+++ b/box_printer_test.go
@@ -29,6 +29,12 @@ func TestBoxPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -47,6 +53,12 @@ func TestBoxPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/center_printer_test.go b/center_printer_test.go
index ad8bd12a..767812ea 100644
--- a/center_printer_test.go
+++ b/center_printer_test.go
@@ -30,6 +30,12 @@ func TestCenterPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -48,6 +54,12 @@ func TestCenterPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/color_test.go b/color_test.go
index c9a084a0..d6d17dd5 100644
--- a/color_test.go
+++ b/color_test.go
@@ -23,6 +23,12 @@ func TestStylePrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -41,6 +47,12 @@ func TestStylePrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
@@ -70,6 +82,12 @@ func TestColorPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -88,6 +106,12 @@ func TestColorPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/header_printer_test.go b/header_printer_test.go
index 2db512b2..bcfee3a7 100644
--- a/header_printer_test.go
+++ b/header_printer_test.go
@@ -34,6 +34,12 @@ func TestHeaderPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -52,6 +58,12 @@ func TestHeaderPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/internal/test_utils.go b/internal/test_utils.go
index 07e26d69..3e7515c0 100644
--- a/internal/test_utils.go
+++ b/internal/test_utils.go
@@ -37,6 +37,15 @@ func TestPrintfContains(t *testing.T, logic func(w io.Writer, format string, a i
 	}
 }
 
+// TestPrintflnContains can be used to test Printfln methods.
+func TestPrintflnContains(t *testing.T, logic func(w io.Writer, format string, a interface{})) {
+	for _, printable := range printables {
+		t.Run(fmt.Sprint(printable), func(t *testing.T) {
+			TestPrintfContains(t, logic)
+		})
+	}
+}
+
 // TestPrintlnContains can be used to test Println methods.
 func TestPrintlnContains(t *testing.T, logic func(w io.Writer, a interface{})) {
 	for _, printable := range printables {
@@ -75,6 +84,15 @@ func TestSprintfContains(t *testing.T, logic func(format string, a interface{})
 	}
 }
 
+// TestSprintflnContains can be used to test Sprintfln methods.
+func TestSprintflnContains(t *testing.T, logic func(format string, a interface{}) string) {
+	for _, printable := range printables {
+		t.Run(fmt.Sprint(printable), func(t *testing.T) {
+			TestSprintfContains(t, logic)
+		})
+	}
+}
+
 // TestSprintlnContains can be used to test Sprintln methods.
 func TestSprintlnContains(t *testing.T, logic func(a interface{}) string) {
 	for _, printable := range printables {
diff --git a/paragraph_printer_test.go b/paragraph_printer_test.go
index 2fe939e8..8006ea9e 100644
--- a/paragraph_printer_test.go
+++ b/paragraph_printer_test.go
@@ -37,6 +37,12 @@ func TestParagraphPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -55,6 +61,12 @@ func TestParagraphPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)
diff --git a/prefix_printer_test.go b/prefix_printer_test.go
index ee442ad3..3568ca52 100644
--- a/prefix_printer_test.go
+++ b/prefix_printer_test.go
@@ -47,6 +47,12 @@ func TestPrefixPrinterPrintMethods(t *testing.T) {
 			})
 		})
 
+		t.Run("Printfln", func(t *testing.T) {
+			internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+				p.Printfln(format, a)
+			})
+		})
+
 		t.Run("Println", func(t *testing.T) {
 			internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 				p.Println(a)
@@ -65,6 +71,12 @@ func TestPrefixPrinterPrintMethods(t *testing.T) {
 			})
 		})
 
+		t.Run("Sprintfln", func(t *testing.T) {
+			internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+				return p.Sprintfln(format, a)
+			})
+		})
+
 		t.Run("Sprintln", func(t *testing.T) {
 			internal.TestSprintlnContains(t, func(a interface{}) string {
 				return p.Sprintln(a)
diff --git a/print_test.go b/print_test.go
index 00396662..a60fbc1d 100644
--- a/print_test.go
+++ b/print_test.go
@@ -23,6 +23,13 @@ func TestSprintf(t *testing.T) {
 	assert.Equal(t, "Hello, World!", Sprintf("Hello, %s!", "World"))
 }
 
+func TestSprintfln(t *testing.T) {
+	for _, randomString := range internal.RandomStrings {
+		assert.Equal(t, randomString+"\n", Sprintfln(randomString))
+	}
+	assert.Equal(t, "Hello, World!\n", Sprintfln("Hello, %s!", "World"))
+}
+
 func TestSprintln(t *testing.T) {
 	for _, randomString := range internal.RandomStrings {
 		assert.Equal(t, randomString+"\n", Sprintln(randomString))
@@ -114,6 +121,37 @@ func TestPrintf(t *testing.T) {
 	})
 }
 
+func TestPrintfln(t *testing.T) {
+	t.Run("enabled output", func(t *testing.T) {
+		Output = true
+		for _, randomString := range internal.RandomStrings {
+			out := internal.CaptureStdout(func(w io.Writer) {
+				Printfln(randomString)
+			})
+			assert.Equal(t, randomString+"\n", out)
+		}
+		out := internal.CaptureStdout(func(w io.Writer) {
+			Printfln("Hello, %s!", "World")
+		})
+		assert.Equal(t, "Hello, World!\n", out)
+	})
+
+	t.Run("disabled output", func(t *testing.T) {
+		Output = false
+		for _, randomString := range internal.RandomStrings {
+			out := internal.CaptureStdout(func(w io.Writer) {
+				Printfln(randomString)
+			})
+			assert.Equal(t, "", out)
+		}
+		out := internal.CaptureStdout(func(w io.Writer) {
+			Printfln("Hello, %s!", "World")
+		})
+		assert.Equal(t, "", out)
+		Output = true
+	})
+}
+
 func TestFprint(t *testing.T) {
 	t.Run("enabled output", func(t *testing.T) {
 		Output = true
diff --git a/rgb_test.go b/rgb_test.go
index 86bde1ad..63664988 100644
--- a/rgb_test.go
+++ b/rgb_test.go
@@ -176,6 +176,19 @@ func TestRGB_Printf(t *testing.T) {
 	}
 }
 
+func TestRGB_Printfln(t *testing.T) {
+	RGBs := []RGB{{0, 0, 0}, {127, 127, 127}, {255, 255, 255}}
+
+	for _, rgb := range RGBs {
+		t.Run(Sprintfln("%v %v %v", rgb.R, rgb.G, rgb.B), func(t *testing.T) {
+			internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+				p := rgb.Printfln(format, a)
+				assert.NotNil(t, p)
+			})
+		})
+	}
+}
+
 func TestRGB_Println(t *testing.T) {
 	RGBs := []RGB{{0, 0, 0}, {127, 127, 127}, {255, 255, 255}}
 
@@ -213,6 +226,18 @@ func TestRGB_Sprintf(t *testing.T) {
 	}
 }
 
+func TestRGB_Sprintfln(t *testing.T) {
+	RGBs := []RGB{{0, 0, 0}, {127, 127, 127}, {255, 255, 255}}
+
+	for _, rgb := range RGBs {
+		t.Run("", func(t *testing.T) {
+			internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+				return rgb.Sprintfln(format, a)
+			})
+		})
+	}
+}
+
 func TestRGB_Sprintln(t *testing.T) {
 	RGBs := []RGB{{0, 0, 0}, {127, 127, 127}, {255, 255, 255}}
 
diff --git a/section_printer_test.go b/section_printer_test.go
index 22698726..4b7fa6f9 100644
--- a/section_printer_test.go
+++ b/section_printer_test.go
@@ -27,6 +27,12 @@ func TestSectionPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Printfln", func(t *testing.T) {
+		internal.TestPrintflnContains(t, func(w io.Writer, format string, a interface{}) {
+			p.Printfln(format, a)
+		})
+	})
+
 	t.Run("Println", func(t *testing.T) {
 		internal.TestPrintlnContains(t, func(w io.Writer, a interface{}) {
 			p.Println(a)
@@ -45,6 +51,12 @@ func TestSectionPrinterPrintMethods(t *testing.T) {
 		})
 	})
 
+	t.Run("Sprintfln", func(t *testing.T) {
+		internal.TestSprintflnContains(t, func(format string, a interface{}) string {
+			return p.Sprintfln(format, a)
+		})
+	})
+
 	t.Run("Sprintln", func(t *testing.T) {
 		internal.TestSprintlnContains(t, func(a interface{}) string {
 			return p.Sprintln(a)