![由於 \patchcmd 產生的額外空間](https://rvso.com/image/281608/%E7%94%B1%E6%96%BC%20%5Cpatchcmd%20%E7%94%A2%E7%94%9F%E7%9A%84%E9%A1%8D%E5%A4%96%E7%A9%BA%E9%96%93.png)
看來\patchcmd
from又etoolbox
增加了三個不需要的空格,如下圖:
\documentclass{minimal}
\usepackage{etoolbox}
\begin{document}
\tracingall% 3 spaces in log file
\def\test{1}]\patchcmd\test{1}{2}{}{}[% 3 spaces between brackets in output
\end{document}
我怎樣才能解決這個問題?
答案1
兩個空格來自 的調用\scantokens
,第三個空格來自程式碼中不受保護的行尾。
\documentclass{minimal}
\usepackage{etoolbox}
\makeatletter
% Add \ifhmode\unskip\fi
\protected\def\etb@ifscanable#1{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{macro}:####2->####3&{%
####1\def\string\etb@resrvda####2{####3}}%
\edef\noexpand\etb@resrvda{\noexpand\etb@resrvda\meaning#1&}}%
\etb@resrvda
\makeatletter
\scantokens\expandafter{\etb@resrvda}%
%%% ADDITION
\ifhmode\unskip\fi
%%% END ADDITION
\expandafter\endgroup\ifx#1\etb@resrvda
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\def\etb@patchcmd@scantoks#1{%
\edef\etb@resrvda{\endgroup
\unexpanded{\makeatletter\scantokens}{#1}%
\catcode\number`\@=\the\catcode`\@\relax}%
\etb@resrvda
%%% ADDITION
\ifhmode\unskip\fi
%%% END ADDITION
}
% Fix a missing `%'
\protected\long\def\etb@ifpattern#1#2{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{#2}####2&{%
\endgroup\noexpand\noexpand\noexpand\ifblank{####2}}%
\edef\noexpand\etb@resrvda{\noexpand\etb@resrvda
\expandafter\strip@prefix\meaning#1\detokenize{#2}&}%
\noexpand\etb@resrvda}% <---------- MISSING IN etoolbox.sty
\etb@resrvda\@secondoftwo\@firstoftwo}
\makeatother
\begin{document}
\def\test{1}]\patchcmd\test{1}{2}{}{}[% brackets for checking
][% for check
\end{document}
然而,最好的策略是永遠不要\patchcmd
在水平模式下使用。
相應的命令\xpatchcmd
就regexpatch
沒有這個問題。
\@empty
可以在兩個 '\scantokens 的末尾添加不同的補丁:
\protected\def\etb@ifscanable#1{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{macro}:####2->####3&{%
####1\def\string\etb@resrvda####2{####3}}%
\edef\noexpand\etb@resrvda{\noexpand\etb@resrvda\meaning#1&}}%
\etb@resrvda
\makeatletter
\scantokens\expandafter{\etb@resrvda\@empty}% <---- ADDED
\expandafter\endgroup\ifx#1\etb@resrvda
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\def\etb@patchcmd@scantoks#1{%
\edef\etb@resrvda{\endgroup
\unexpanded{\makeatletter\scantokens}{#1\noexpand\@empty}% <---- ADDED
\catcode\number`\@=\the\catcode`\@\relax}%
\etb@resrvda}
在第二種情況下,\noexpand\@empty
需要,因為我們在一個\edef
.然而,這需要比我願意做的更多的測試。
我本來想用它\patchcmd
自己來修補這兩個命令,但它們拒絕這樣做。