如何正确捕获命令的返回值?

如何正确捕获命令的返回值?

我在捕获命令的返回值时遇到了问题。

以下是我的命令定义序言:

\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}

相关内容