我需要找到一个字符串的深度,为此我想循环遍历该字符串并询问每个字符的深度。
我要求这样的深度:
\dimen=\fontchardp\expandafter\font`\a
并像这样循环:
\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]
\newcount\X \X=\len
\loop
\StrMid{\mystring}{\X}{\X}\par
\advance \X by -1
\unless\ifnum \X<1
\repeat
但这不起作用,尽管我尝试了不同的组合\expandafter
:
\dimen=\fontchardp\font`\StrMid{\mystring}{\X}{\X}
如果有更简单的方法获得弦的深度我将不胜感激,但我也想知道如何使上一行代码正常工作。谢谢。
答案1
这marsupilam 的回答涵盖了通常如何完成任务:排版内容并获取框深度。
你的代码有两个问题。首先,TeX 基元后面\dimen
必须跟一个寄存器编号,而不是=
。由于 是\dimen0
LaTeX 中的临时寄存器,因此你可以使用\dimen0=<some valid dimension>
。其次,\StrMid
不会生成字母本身(它不是“可扩展的”),它是在排版上下文中执行此操作的指令。但是,有一个可选参数将“返回”您想要的内容
\StrMid{\mystring}{\X}{\X}[\tmp] % \tmp now expands to the substring
我们可以用它来\expandafter
得到\fontchardp
所需的内容:角色数字你对。。。感兴趣
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]
\newcount\X
\X=\len
\loop
\StrMid{\mystring}{\X}{\X}[\tmp]
\dimen0=\fontchardp\expandafter\font\expandafter`\tmp
\edef\x{\tmp\space\the\dimen0 }%
\show\x
\advance \X by -1 %
\unless\ifnum \X<1 %
\repeat
\end{document}
(我展示的只是结果,而不是排版)
答案2
我不知道你使用循环的方法,但为了获得深度,只需使用\settodepth
看 :https://tex.stackexchange.com/a/37294/116936
您还可以使用calc
包\depthof
\documentclass{article}
\begin{document}
\def\mystring{abcdefgh}
\newlength\myLength
\settodepth{\myLength}{\mystring}
\the\myLength
\end{document}
干杯,
答案3
与 Joseph 的类似,但使用的代码更少
\documentclass{article}
\usepackage{xstring}
\newcount\X
\newdimen\stringdepth
\begin{document}
\def\mystring{abcdefgh}
\StrLen{\mystring}[\len]
\X=0
\stringdepth=0pt
\loop
\ifnum\len>\X
\advance\X by 1
\StrChar{\mystring}{\X}[\tmp]%
\begingroup\edef\x{\endgroup
\dimen0=\fontchardp\font`\tmp\relax
}\x
\ifdim\dimen0>\stringdepth \stringdepth=\dimen0 \fi
% just for showing the work
\typeout{\tmp\space has depth \the\dimen0 }%
\repeat
\typeout{Max depth: \the\stringdepth}
\end{document}
当然
\settodepth{\stringdepth}{\mystring}
效率更高。
不同的循环,非常灵活,如示例所示:当前项#1
在最后一个参数中被称为\stringloop
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\stringloop}{smm}
{
\IfBooleanTF{#1}
{ % we have a macro as argument
\tl_map_inline:Nn #2 { #3 }
}
{ % an explicit token list
\tl_map_inline:nn { #2 } { #3 }
}
}
\ExplSyntaxOff
\newdimen\stringdepth
\begin{document}
\def\mystring{abcdefgh}
\stringloop{abcdefgh}{\typeout{#1 has depth \the\fontchardp\font`#1}}
\stringdepth=0pt
\stringloop*{\mystring}{%
\ifdim\fontchardp\font`#1>\stringdepth
\stringdepth=\fontchardp\font`#1\relax
\fi
}
\typeout{Max depth in \mystring: \the\stringdepth}
\end{document}
以下是终端(和日志文件)上的输出:
a has depth 0.0pt
b has depth 0.0pt
c has depth 0.0pt
d has depth 0.0pt
e has depth 0.0pt
f has depth 0.0pt
g has depth 1.94444pt
h has depth 0.0pt
Max depth in abcdefgh: 1.94444pt