请参阅此 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}