就像stackoverflow 上的这个问题,我想复制所谓的‘大文本’格式:
功能:
- 您输入的内容为:
- 每行(列)的宽度,
- 以及每行的内容。
- 每行的字体大小都是动态调整的,以便所有行都具有相同的宽度。
(请注意,在前面的例子中,每行只有一个单词长。但是,我希望能够有更长的行(就单词数量而言),如这个例子。
问题:如何用 LaTeX 实现这种格式?
部分/不令人满意的解决方案(迄今为止):
- 当然,对齐文本并不令人满意,因为它通过调节字符和/或单词间距来调整行长……而不是字体大小。
- 通过调整字体大小使文本适合给定的框开发一个解决方案,但更像是一个“最大”约束(它不会使文本变大以填满所有空间)。
编辑:
这种格式在视觉上强大的原因是每行的第一个/最后一个像素都是对齐的(换句话说:没有字距也没有突出)*。然而,在建议的答案中,它们的突出在最后两行的开头尤其明显。
所以,是否可以对每行的开始和结束进行“像素对齐”?(如果是,怎么办?!)
*说实话,我注意到给定示例中有一个小突起。但它没有建议答案中那么明显,我希望完全没有突起。
答案1
expl3
一种更清晰语法的实现:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\bigtext}{mm}
{ % #1 = width, #2 = text, with \\ to separate lines
\ebo_bigtext:nn { #1 } { #2 }
}
\seq_new:N \l_ebo_bigtext_text_seq
\box_new:N \l_ebo_bigtext_line_box
\cs_new_protected:Nn \ebo_bigtext:nn
{
\begin{minipage}{#1}
\baselineskip=-\maxdimen \lineskip=4pt
\seq_set_split:Nnn \l_ebo_bigtext_text_seq { \\ } { #2 }
\seq_map_inline:Nn \l_ebo_bigtext_text_seq
{
\hbox_set:Nn \l_ebo_bigtext_line_box { ##1 }
\box_resize_to_wd:Nn \l_ebo_bigtext_line_box { \textwidth }
\box_use:N \l_ebo_bigtext_line_box
}
\end{minipage}
}
\ExplSyntaxOff
\begin{document}
\noindent
\bigtext{15em}{SOME \\ TOTALLY \\ HIPSTER \\ QUOTE \\ ABOUT \\ LIFE}
\quad
\sffamily
\bigtext{15em}{SOME \\ TOTALLY \\ HIPSTER \\ QUOTE \\ ABOUT \\ LIFE}
\end{document}
周围的空格\\
将被忽略。
可以添加一个可选参数来设置行之间的垂直空间,在上面的宏中将其设置为 3pt。
使用 XeLaTeX,但对于行中只有一个字母的情况需要进一步细化:
\documentclass{article}
\usepackage{xparse,l3regex}
\usepackage{fontspec}
\ExplSyntaxOn
\NewDocumentCommand{\bigtext}{mm}
{ % #1 = width, #2 = text, with \\ to separate lines
\ebo_bigtext:nn { #1 } { #2 }
}
\seq_new:N \l_ebo_bigtext_text_seq
\box_new:N \l_ebo_bigtext_line_box
\tl_new:N \l_ebo_bigtext_line_tl
\cs_new_protected:Nn \ebo_bigtext:nn
{
\begin{minipage}{#1}
\baselineskip=-\maxdimen \lineskip=4pt
\seq_set_split:Nnn \l_ebo_bigtext_text_seq { \\ } { #2 }
\seq_map_inline:Nn \l_ebo_bigtext_text_seq
{
\hbox_set:Nn \l_ebo_bigtext_line_box { \ebo_bigtext_remsb:n { ##1 } }
\box_resize_to_wd:Nn \l_ebo_bigtext_line_box { \textwidth }
\box_use:N \l_ebo_bigtext_line_box
}
\end{minipage}
}
\cs_new_protected:Nn \ebo_bigtext_remsb:n
{
\tl_set:Nn \l_ebo_bigtext_line_tl { #1 }
\regex_replace_once:nnN { \A(.) } { \c{ebo_kleft:n}\cB\{\1\cE\} } \l_ebo_bigtext_line_tl
\regex_replace_once:nnN { (.)\Z } { \c{ebo_kright:n}\cB\{\1\cE\} } \l_ebo_bigtext_line_tl
\tl_use:N \l_ebo_bigtext_line_tl
}
\cs_new_protected:Nn \ebo_kleft:n
{
\kern-\XeTeXglyphbounds1~\the\XeTeXcharglyph`#1 #1
}
\cs_new_protected:Nn \ebo_kright:n
{
#1\kern-\XeTeXglyphbounds3~\the\XeTeXcharglyph`#1
}
\ExplSyntaxOff
\begin{document}
\noindent
\bigtext{15em}{SOME \\ TOTALLY \\ HIPSTER \\ QUOTE \\ ABOUT \\ LIFE}
\quad
\sffamily
\bigtext{15em}{SOME \\ TOTALLY \\ HIPSTER \\ QUOTE \\ ABOUT \\ LIFE}
\end{document}
答案2
这是一个解决方案,使用adjustbox
行之间的垂直间距可以稍微改变,并且语法可能需要一些批准。
输出
代码
\documentclass[11pt, margin=5pt]{standalone}
\usepackage{adjustbox}
\usepackage{xcolor}
\usepackage{pgffor}
\usepackage{helvet}
\definecolor{Pink}{HTML}{E22E3B}
\definecolor{Blue}{HTML}{0C2153}
\definecolor{DarkBlue}{HTML}{0C1C3B}
\definecolor{Red}{HTML}{C51E1F}
\setlength{\fboxrule}{4pt}
\setlength{\fboxsep}{10pt}
\newcommand{\BigWords}[1]{%
\adjustboxset{min width=\linewidth, margin*=0.2em 1ex 0ex 0ex}%
\foreach \i [count=\ni] in {#1}{%
\ifnum\ni=1
\adjustbox{}{\i}%
\else
\\\adjustbox{}{\i}%
\fi
}\vspace{-1ex}%
}
\begin{document}
\fbox{%
\begin{minipage}{15cm}
\bfseries\sffamily
\BigWords{SOME,TOTALLY,HIPSTER,QUOTE,ABOUT,LIFE}%
\end{minipage}%
}%
\hspace{2em}%
\setlength{\fboxrule}{0.5pt}%
\fbox{%
\begin{minipage}{20cm}
\bfseries\sffamily
\BigWords{
\textcolor{Pink}{RUN},
\textcolor{Blue}{LIKE},
\textcolor{DarkBlue}{RYAN},
\textcolor{Red}{GOSLING},
\textcolor{Pink}{IS WAITING},
\textcolor{Blue}{FOR YOU},
\textcolor{DarkBlue}{AT THE},
\textcolor{Red}{FINISH LINE},
\textcolor{Pink}{(WITH A PUPPY)}%
}%
\end{minipage}%
}
\end{document}
答案3
这是一个选项,只需使用resizebox
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\newlength\foo
\setlength\foo{15em}
\noindent
\resizebox{\foo}{!}{SOME}\\
\resizebox{\foo}{!}{TOTALLY}\\
\resizebox{\foo}{!}{HIPSTER}\\
\resizebox{\foo}{!}{QUOTE}\\
\resizebox{\foo}{!}{ABOUT}\\
\resizebox{\foo}{!}{LIFE}\\
\end{document}
它既不优雅又繁琐。但这是一个概念证明。这可以与以下答案结合起来这个问题以寻求更自动化的解决方案。