“BigText” 格式:如何调整字体大小以使所有行具有相同的宽度?

“BigText” 格式:如何调整字体大小以使所有行具有相同的宽度?

就像stackoverflow 上的这个问题,我想复制所谓的‘大文本’格式:

在此处输入图片描述

功能:

  1. 您输入的内容为:
    • 每行(列)的宽度,
    • 以及每行的内容。
  2. 每行的字体大小都是动态调整的,以便所有行都具有相同的宽度。

(请注意,在前面的例子中,每行只有一个单词长。但是,我希望能够有更长的行(就单词数量而言),如这个例子

问题:如何用 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}

它既不优雅又繁琐。但这是一个概念证明。这可以与以下答案结合起来这个问题以寻求更自动化的解决方案。

相关内容