我编写了一个生成 LaTeX 代码的软件。出于各种原因,我想知道相对于当前字体设置的最大字符的宽度。
作为一名开发人员,我编写了一个 Perl 脚本,它可以生成 LaTeX 文档(我们称之为“输出.tex“)。这个 LaTeX 文档(“output.tex”)一旦经过 LuaLaTeX 处理,就会生成一个包含所有字符宽度(和其他尺寸)的文件(我们称之为“output.dim”)。
请注意,如果您对 Perl 脚本感兴趣,您可以找到它这里(这是文件“char.pl”)。
文件 ”输出.tex“ 好像 :
请注意,我并没有在这里展示文件的所有内容。我删除了一些行。你可以在这里获取完整文件永久链接。
\documentclass{article}
\usepackage[a4paper]{geometry}
\renewcommand{\normalsize}{\fontsize{10pt}{12pt}\selectfont}
\usepackage{newfile}
\newoutputstream{dimensions}
\openoutputfile{\jobname.dim}{dimensions}
\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0px}
\begin{document}
\newsavebox{\boxaaaa}
\savebox{\boxaaaa}{\framebox{a}}
\addtostream{dimensions}{a: \the\wd\boxaaaa, \the\ht\boxaaaa, \the\dp\boxaaaa}
\newsavebox{\boxbaaa}
\savebox{\boxbaaa}{\framebox{b}}
\addtostream{dimensions}{b: \the\wd\boxbaaa, \the\ht\boxbaaa, \the\dp\boxbaaa}
\newsavebox{\boxcaaa}
\savebox{\boxcaaa}{\framebox{c}}
\addtostream{dimensions}{c: \the\wd\boxcaaa, \the\ht\boxcaaa, \the\dp\boxcaaa}
% More lines...
\newsavebox{\boxzzka}
\savebox{\boxzzka}{\framebox{8}}
\addtostream{dimensions}{8: \the\wd\boxzzka, \the\ht\boxzzka, \the\dp\boxzzka}
\newsavebox{\boxzzla}
\savebox{\boxzzla}{\framebox{9}}
\addtostream{dimensions}{9: \the\wd\boxzzla, \the\ht\boxzzla, \the\dp\boxzzla}
\end{document}
文件 ”输出.dim“ 好像 :
请注意,我并没有在这里展示文件的所有内容。我删除了一些行。你可以在这里获取完整文件永久链接。
a: 5.8pt, 4.70554pt, 0.4pt
b: 6.35556pt, 7.34444pt, 0.4pt
c: 5.24443pt, 4.70554pt, 0.4pt
...
8: 5.8pt, 6.84444pt, 0.4pt
9: 5.8pt, 6.84444pt, 0.4pt
好的。因此,使用生成的文件“output.dim”的内容,我可以获取给定字体设置的所有字符的尺寸。这样,我就可以获取字符的最大宽度(一个简单的脚本就可以完成这项工作)。
这个解决方案可行……但是,它不够优雅。您必须执行(Perl)脚本来获取尺寸,然后才能生成 LaTeX 文档(通过其他脚本)。此外,所有关于尺寸的计算都应该由 LaTeX 处理。
相对于当前字体设置,您是否有更优雅的解决方案来获取最宽字符的宽度?
谢谢。
答案1
这是可扩展的:如果不仅需要字母数字,只需添加到初始列表中(重音字符应该用括号括起来以确保安全,例如{é}
)。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn
\tl_const:Nn \c_beurive_alphabet_tl
{
0123456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
}
\box_new:N \l__beurive_widest_box
\dim_new:N \l__beurive_widest_dim
\tl_new:N \l__beurive_widest_tl
\tl_new:N \widestchar
\dim_new:N \widestcharwd
\NewDocumentCommand{\computewidest}{O{}}
{
\group_begin:
#1 % optionally select a font
\dim_zero:N \l__beurive_widest_dim
\tl_clear:N \l__beurive_widest_tl
\tl_map_inline:Nn \c_beurive_alphabet_tl
{
\hbox_set:Nn \l__beurive_widest_box { ##1 }
\dim_compare:nT { \box_wd:N \l__beurive_widest_box > \l__beurive_widest_dim }
{
\dim_set:Nn \l__beurive_widest_dim { \box_wd:N \l__beurive_widest_box }
\tl_set:Nn \l__beurive_widest_tl { ##1 }
}
}
\dim_gset_eq:NN \widestcharwd \l__beurive_widest_dim
\tl_gset_eq:NN \widestchar \l__beurive_widest_tl
\group_end:
}
\ExplSyntaxOff
\begin{document}
\computewidest
The widest character is ``\widestchar'', width \the\widestcharwd
\bigskip
\computewidest[\Large\bfseries\itshape]
The widest character is ``\widestchar'', width \the\widestcharwd
\bigskip
\computewidest[\ttfamily]
The widest character is ``\widestchar'', width \the\widestcharwd
\end{document}