使用自定义十进制到分数转换命令时,\chapterprecistoc 命令会导致无限的编译时间

使用自定义十进制到分数转换命令时,\chapterprecistoc 命令会导致无限的编译时间

请参阅此 MWE。

\documentclass{memoir}

% Adapted from https://tex.stackexchange.com/a/176815/14103
\usepackage{tikz}
\usepackage{xfrac}
\usetikzlibrary{fpu}
\newcommand{\dectofrac}[1]{\begingroup%
  \pgfkeys{/pgf/number format/frac}% Format as fraction
  \let\frac\sfrac% Let \frac act like \sfrac
  \pgfmathprintnumber{#1}\endgroup}

\begin{document}

\chapter{First}
\chapterprecishere{\dectofrac{0.25}}
\chapterprecistoc{\dectofrac{0.25}} % Works fine when this line is
                                    % commented out or the \dectofrac
                                    % is not used

\end{document}

编译会导致进程无限期运行,没有任何错误消息。我们只能使用 Ctrl-C 退出,终端输出如下:

Interruption.
\pgfkeys@parse ...uturelet \pgfkeys@possiblerelax 
                                                  \pgfkeys@parse@main 
l.16 \chapterprecistoc{\dectofrac{0.25}}

\chapterprecistoc当包含注释掉的行时,编译过程不会出现任何错误。这里的罪魁祸首是\dectofrac命令,因为\chapterprecistoc如果我们不使用此命令,它将正常工作。除此之外,我对此一无所知。

答案1

您可以声明一个强健的命令\inlinedectofrac,该命令可以在 内部使用\chapterprecistoc。或者您可以\protect在 之前使用\dectofrac

有关详细信息,请参阅脆弱命令和坚固命令之间有什么区别?

\documentclass{memoir}

% Adapted from https://tex.stackexchange.com/a/176815/14103
\usepackage{tikz}
\usepackage{xfrac}
\usetikzlibrary{fpu}
\newcommand{\dectofrac}[1]{\begingroup%
  \pgfkeys{/pgf/number format/frac}% Format as fraction
  \let\frac\sfrac% Let \frac act like \sfrac
  \pgfmathprintnumber{#1}\endgroup}

\DeclareRobustCommand{\inlinedectofrac}[1]{%
  \dectofrac{#1}%
}

\begin{document}

\tableofcontents

\chapter{First}
\chapterprecistoc{\inlinedectofrac{0.25}}

\chapter{Second}
\chapterprecistoc{\protect\dectofrac{0.75}}

\end{document}

在此处输入图片描述

或者,使用\NewDocumentCommand,可用作xfrac负载xparse;这不需要\protect或其他命令。

\documentclass{memoir}

% Adapted from https://tex.stackexchange.com/a/176815/14103
\usepackage{tikz}
\usepackage{xfrac}
\usetikzlibrary{fpu}
\NewDocumentCommand{\dectofrac}{m}{\begingroup%
  \pgfkeys{/pgf/number format/frac}% Format as fraction
  \let\frac\sfrac% Let \frac act like \sfrac
  \pgfmathprintnumber{#1}\endgroup}

\begin{document}

\tableofcontents

\chapter{First}
\chapterprecistoc{\dectofrac{0.25}}

\chapter{Second}
\chapterprecistoc{\dectofrac{0.75}}

\end{document}

相关内容