如何使用 xpretocmd 退出 #1

如何使用 xpretocmd 退出 #1

以这个 MWE 为例:

\documentclass{article}
\usepackage{acro}
\DeclareAcronym{ram}{short=RAM, long=random access memory}
\newcommand{\test}[1]{RAM}

\usepackage{xpatch}
\begin{document}

\test{ram}

% This works:
\xpretocmd{\test}{#1=}{}{}
\test{ram}


\acs{ram}

% This does not, it outputs "#1":
\xpretocmd{\acroprintfield}{#1=}{}{}
\acs{ram}

\end{document}

因此,似乎通常不需要#在 中“转义”(或以其他方式处理) xpatch,但似乎某些命令需要。我做错了什么?

答案1

作为一种快速但不完整的解决方法,您可以修补\acroprintfield code(这是一个名称中带有空格的单个控制序列),它存储了的真实主体\acroprintfield

我不熟悉,acro也没有读过https://github.com/cgnieder/acro/issues/193. 您很有可能可以从侧面实现更好的解决方案(例如可配置的用户界面)acro

\documentclass{article}
\usepackage{acro}
\DeclareAcronym{ram}{short=RAM, long=random access memory}
\newcommand{\test}[1]{RAM}

\usepackage{xpatch}
\begin{document}

\test{ram} % get "RAM"

% This works:
\xpretocmd{\test}{#1=}{}{}

\test{ram} % get "ram=RAM"


\acs{ram}  % get "RAM"

% This works too:
\ExplSyntaxOn
\expandafter\xpretocmd
  \csname acroprintfield~ code\endcsname
  {#1=}
  {}{\fail}
\ExplSyntaxOff

\acs{ram}  % get "ram=RAM"

\end{document}

在此处输入图片描述

答案2

我的解决方法如下:

let\oldacroprintfield\acroprintfield​
​\renewcommand​{​\acroprintfield​}[2]{​%​
       #1=\oldacroprintfield​{#1}{#2}}

相关内容