我在捕获命令的返回值时遇到了问题。
以下是我的命令定义序言:
\documentclass[convert={density=300,size=800x600,outext=.png}]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
% Font used for writing commands.
\def\cmdFont{\fontsize{10}{12}\selectfont}
% Commands.
\def\cmdOne {\cmdFont aaa}
\def\cmdTwo {\cmdFont bbbbb}
\def\cmdThree{\cmdFont cccc}
% Function which returns maximum width needed to write any of provided arguments.
\makeatletter
\newlength{\textLength@getMaximumWidthHelper}
\newlength{\textLength@getMaximumWidth}
\newcommand{\getMaximumWidthHelper}[2]
{%
\settowidth{\textLength@getMaximumWidthHelper}{\pgfinterruptpicture #2\endpgfinterruptpicture}%
\pgfmathparse{max(#1,\textLength@getMaximumWidthHelper)}%
\@ifnextchar\bgroup{\getMaximumWidthHelper{\pgfmathresult pt}}{\pgfmathresult pt}%
}%
\newcommand{\getMaximumWidth}[1]
{%
\settowidth{\textLength@getMaximumWidth}{\pgfinterruptpicture #1\endpgfinterruptpicture}%
\@ifnextchar\bgroup{\getMaximumWidthHelper{\the\textLength@getMaximumWidth}}{\the\textLength@getMaximumWidth}%
}%
\makeatother
用于测试上述命令的工作示例:
\begin{document}
\getMaximumWidth{\cmdOne}
\getMaximumWidth{\cmdOne}{\cmdTwo}
\getMaximumWidth{\cmdOne}{\cmdTwo}{\cmdThree}
\end{document}
但是,当我尝试捕获的输出时getMaximumWidth
,它并没有按预期工作。
\begin{document}
\newlength{\maximumWidth}
\setlength{\maximumWidth}{\getMaximumWidth{\cmdOne}{\cmdTwo}{\cmdThree}}
\the\maximumWidth
\end{document}
getMaximumWidth
在第二行,没有捕获返回值,但立即打印出来。
之后我收到一个错误:
!缺失数字,视为零。
此后,第三行只打印默认值0.0pt
。
捕获输出的正确方法是什么getMaximumWidth
?
PS 这是我第一次编写 Latex 文档,如有不足之处请随时指出。
答案1
我会概括\settowidth
,顺便说一句,还可以免费获得高度和深度。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
\iskustvo_settomaxdim:Nnn \settowidth { #1 } { #2 }
}
\NewDocumentCommand{\settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
\iskustvo_settomaxdim:Nnn \settoheight { #1 } { #2 }
}
\NewDocumentCommand{\settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
\iskustvo_settomaxdim:Nnn \settodepth { #1 } { #2 }
}
\dim_new:N \l__iskustvo_tempa_dim
\dim_new:N \l__iskustvo_tempb_dim
\tl_new:N \l__iskustvo_temp_tl
\cs_new_protected:Nn \iskustvo_settomaxdim:Nnn
{
\dim_zero:N \l__iskustvo_tempa_dim
\clist_map_variable:nNn { #3 } \l__iskustvo_temp_tl
{ \__iskustvo_measure:N #1 }
\dim_set_eq:NN #2 \l__iskustvo_tempa_dim
}
\cs_new_protected:Nn \__iskustvo_measure:N
{
#1{\l__iskustvo_tempb_dim}{\l__iskustvo_temp_tl}
\dim_set:Nn \l__iskustvo_tempa_dim
{
\dim_max:nn { \l__iskustvo_tempa_dim } { \l__iskustvo_tempb_dim }
}
}
\ExplSyntaxOff
% Font used for writing commands.
\def\cmdFont{\fontsize{10}{12}\selectfont}
% Commands.
\def\cmdOne {\cmdFont aaa}
\def\cmdTwo {\cmdFont bbbbb}
\def\cmdThree{\cmdFont cccc}
\begin{document}
\newlength{\test}
\settomaximumwidth{\test}{\cmdOne,\cmdTwo,\cmdThree}
\the\test
\settomaximumheight{\test}{\cmdOne,\cmdTwo,\cmdThree}
\the\test
\settomaximumdepth{\test}{\cmdOne,\cmdTwo,\cmdThree}
\the\test
\end{document}
答案2
我会写类似
\documentclass{article}
\newcommand\cmdFont{\fontsize{10}{12}\selectfont}% this is the default anyway
% Commands.
\newcommand\cmdOne {\cmdFont aaa}
\newcommand\cmdTwo {\cmdFont bbbbb}
\newcommand\cmdThree{\cmdFont cccc}
\newlength{\maximumWidth}
\newcommand{\getMaximumWidth}[1]{%
\settowidth\maximumWidth{\begin{tabular}{@{}l@{}}#1\end{tabular}}}
\begin{document}
\getMaximumWidth{\cmdOne\\ \cmdTwo\\ \cmdThree}
\the\maximumWidth
\end{document}