最宽字符的宽度,相对于字体设置

最宽字符的宽度,相对于字体设置

我编写了一个生成 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}

在此处输入图片描述

相关内容