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