有没有简单的方法来修补包含 ^^J 的命令?

有没有简单的方法来修补包含 ^^J 的命令?

我目前正在研究与此相关的各种问题multicol,并尝试回答其中一些问题。通常,答案会涉及修补\balance@columns或类似的宏,在这种情况下,\patchcmdfrometoolbox会失败,因为宏中有换行符,例如,

       \message{^^JColumn
          \number\@tempcnta\space
           badness: \the\badness\space}%

现在,我当然可以将整个定义添加\balance@columns到我的答案中,但是这个命令有 165 行,所以我宁愿避免这种情况。

^^J有没有什么简单的方法可以修补(或从外部摆脱)我所缺少的东西?

答案1

不确定为什么^^J是个问题,难道它不是只有\newlinechar在使用东西时才特殊吗\write

\documentclass{article}

\def\zz{aaa^^Jbbb \foo ccc}

\def\patchzz#1\foo#2\zzz{\def\zz{#1\bar#2}}

\show\zz
\expandafter\patchzz\zz\zzz

\show\zz



\stop

啊,如果\patchcmd使用\scantokens那是写入,那么您可能只想本地重置\newlinechar

一个例子是etoolbox(来自约瑟夫:-)

\documentclass{article}
\usepackage{etoolbox}
\tracingpatches
\usepackage{multicol}
\makeatletter
\show\balance@columns
\edef\reset@newlinechar{\newlinechar\the\newlinechar}
\newlinechar-1 %
\patchcmd{\balance@columns}
  {\ifshr@nking \vfill \fi}
  {\CHANGED}
  {}
  {}
\show\balance@columns
\reset@newlinechar

答案2

您可以使用regexpatch

\documentclass{article}
\usepackage{regexpatch}
\tracingxpatches
\usepackage{multicol}
\makeatletter
\show\balance@columns
\xpatchcmd{\balance@columns}
  {\ifshr@nking \vfill \fi}
  {\CHANGED}
  {}
  {}
\show\balance@columns

相关内容