以这个 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}}