hbox 的动态字体大小

hbox 的动态字体大小

我想在 TeX 中创建一个元素,将其定义为具有固定宽度的水平框,并包含几行(我的情况是三行)。每行应根据其大小自动与水平框大小对齐 - 我不想根据字体大小进行对齐,因为这样长度就不完全相同了。

不用说,这些台词的字数是不同的。

Same
Word length
Even though lines are different

在这种情况下,第一行字体应该很大,第二行字体稍小一些,第三行字体最小。

我想使用 XeTeX 及其连接功能来给字体增添一些趣味。

非常感谢您的帮助(提前)

答案1

以下是 Aditya 所做工作的 LaTeX 版本:

\documentclass[12pt]{article}
\usepackage{calc,fontspec,graphicx}
\setmainfont[Ligatures=Rare]{Didot LT Pro}
\begin{document}
\centering
% scale to 3 inches
\resizebox{3in}{!}{Same}\\[.75em]% adjust vertical spacing to taste
\resizebox{3in}{!}{Word length}\\[.5em]
\resizebox{3in}{!}{Even though lines are different}\\

\vspace{5ex}

% scale to length of second line
\Huge
\resizebox{\widthof{Word length}}{!}{Same}\\
Word length\\[-.25em]
\resizebox{\widthof{Word length}}{!}{Even though lines are different}
\end{document}

Didot scaled in two ways

我没有能力实现自动化,而且我怀疑是否应该尝试:为了获得最佳效果,需要手动调整垂直间距和宽度,同时考虑字形的形状和所需的效果。例如,在我看来,如果我将第一行的宽度缩放到 3.12 英寸,它的宽度看起来会更像其他行。并且可能需要在一行或\hspace另一行的开头添加或减去一些,因为准确居中的位置在眼睛看来可能看起来偏离中心,这同样取决于字形的形状。

这种方法需要时间,但如果一段文本值得以这种风格设置,那么值得付出努力进行手动调整。

答案2

您可以将每条线缩放到适当的长度。例如,在 ConTeXt 中,我将使用:

\starttext

\startframedtext
    [frame=off,width=8cm]
\setupscale[width=\hsize]
\scale{Same}\\
\scale{Word length}\\
\scale{Even though lines are different}
\stopframedtext

\stoptext

这使

enter image description here

我确信 LaTeX 中存在类似的缩放宏。

还可以定义一个环境,让每行自动缩放到适当的宽度。如果您需要,我可以提供代码。

答案3

Thérèse 答案的自动版本

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\sdoky}{O{c}mm}
 {% #1 = vertical alignment, #2 = desired size, #3 = items to stack
  \parbox[#1]{#2}
   {
    \vspace{0pt} % set the very top as reference point in 't' case
    \setlength{\lineskiplimit}{\maxdimen} % all lines are too near
    \setlength{\lineskip}{3pt} % add 3pt between lines
    \sdoky_equalize:n { #3 }
   }
 }

\seq_new:N \l__sdoky_equalize_seq
\box_new:N \l__sdoky_equalize_box

\cs_new_protected:Nn \sdoky_equalize:n
 {
  \seq_set_split:Nnn \l__sdoky_equalize_seq { \\ } { #1 }
  \seq_map_inline:Nn \l__sdoky_equalize_seq
   {
    \sdoky_equalize_space:w ##1 \q_stop
   }
 }

\NewDocumentCommand{\sdoky_equalize_space:w}{o}
 {
  \IfValueT{#1}{\vspace{#1}}
  \__sdoky_equalize_line:w
 }

\cs_new_protected:Npn \__sdoky_equalize_line:w #1 \q_stop
 {
  \hbox_set:Nn \l__sdoky_equalize_box { \tl_trim_spaces:n { #1 } }
  \box_resize_to_wd:Nn \l__sdoky_equalize_box { \linewidth}
  \box_use_drop:N \l__sdoky_equalize_box
 }

\ExplSyntaxOff

\begin{document}

\sdoky{4cm}{
  Same \\
  Word length \\
  Even though lines are different
}
\sdoky{6cm}{
  Same \\
  Word length \\
  Even though lines are different
}

\bigskip

\sdoky[t]{4cm}{
  Same \\
  Word length \\
  Even though lines are different
}
\sdoky[t]{6cm}{
  Same \\
  Word length \\
  Even though lines are different
}

\bigskip

\sdoky[b]{4cm}{
  Same \\[2ex]
  Word length \\[4ex]
  Even though lines are different
}
\sdoky[b]{6cm}{
  Same \\[2ex]
  Word length \\[4ex]
  Even though lines are different
}

\end{document}

enter image description here

相关内容