为什么这个对 multicol 的修补没有效果?

为什么这个对 multicol 的修补没有效果?

2018年12月19日更新:我现在把它变成了一个管理装饰规则的完整包,叫做multicolrule

我试图扩展解决方案这里这里,用虚线代替多列文本之间的普通规则,以便用任意图案代替线条,无论是实线、虚线还是其他图案。虽然我有一个可行的解决方案,但我的第一次尝试没有成功,我想了解原因。

我的第一次尝试是使用它xpatch来重写\LR@column@boxes\RL@column@boxes如下所示:

\xpatchcmd{\LR@column@boxes}
{\vrule\@width\columnseprule}
{\multicoldivider}
{\typeout{Patched \string\LR@column@boxes}}{\typeout{Error patching \string\LR@column@boxes}}

我的目的是用我自己的函数替换规则排版的部分,保持\columnseprulecolor原样。虽然日志表明补丁成功,并\show\LR@column@boxes显示修改后的宏具有正确的代码,但这种更改无效。如果\columnseprule设置为非零值,则会出现普通的固体规则。我尝试了类似的补丁,\@outputdblcol用于twocolumn没有多列的设置,效果很好。

我采用了 David Carlisle 的方法,实现了我想要的最终结果他对这个问题的回答,但我很困惑为什么xpatch这里什么都没做。

MWE 显示工作尝试和非工作尝试。

\documentclass{article}
%\documentclass[twocolumn]{article}
\usepackage{multicol}
\usepackage{xpatch}
\usepackage{lipsum}
\usepackage{xcolor}

\newcommand*{\myrulecolor}{\color{red}}
\makeatletter

\newcommand*{\multicoldivider}{\myrulecolor\myrule}

\newcommand*{\dottedline}{%
  \vbox to \ht\mult@rightbox{\leaders\vbox{\kern.5pt\hbox{.}\kern.5pt}\vfill}%
}

\newcommand*{\myrule}{\dottedline}

\newcommand*{\solidline}{\vrule\@width .5pt}

\newcommand*{\setruletype}[1]{%
  \renewcommand*{\myrule}{#1}
}

% This patch works for default twocolumn mode
\xpatchcmd{\@outputdblcol}
{\vrule\@width\columnseprule}
{\multicoldivider}
{\typeout{Patched \string\@outputdblcol}}{\typeout{Error patching \string\@outputdblcol}}

% This redefinition works for multicol
\newcommand*{\ruleredef}{%
  \def\columnseprulecolor\vrule\@width\columnseprule{\multicoldivider}%
}

% These patches to multicol have no effect
\xpatchcmd{\LR@column@boxes}
{\columnseprulecolor\vrule\@width\columnseprule}
{\multicoldivider}
{\typeout{Patched \string\LR@column@boxes}}{\typeout{Error patching \string\LR@column@boxes}}

\xpatchcmd{\RL@column@boxes}
{\columnseprulecolor\vrule\@width\columnseprule}
{\multicoldivider}
{\typeout{Patched \string\RL@column@boxes}}{\typeout{Error patching \string\RL@column@boxes}}

\makeatother

\begin{document}

% Patched but no dotted rule
\begin{multicols}{2}
  \lipsum[1]
\end{multicols}

\ruleredef
\begin{multicols}{2}
  \lipsum[1]
\end{multicols}

\renewcommand*{\myrulecolor}{\color{green}}
\setruletype{\solidline}
\begin{multicols}{2}
  \lipsum[1]
\end{multicols}
\end{document} 

输出:

enter image description here

答案1

multicol.sty

\newcommand\RLmulticolcolumns
    {\let\mc@align@columns
         \RL@column@boxes}
\newcommand\LRmulticolcolumns
    {\let\mc@align@columns
      \LR@column@boxes}
\LRmulticolcolumns

所以你必须重新发布\LRmulticolcolumna

\documentclass{article}
\usepackage{multicol}
\usepackage{xpatch}
\usepackage{lipsum}
\usepackage{xcolor}

\newcommand*{\myrulecolor}{\color{red}}

\makeatletter
\newcommand*{\multicoldivider}{\myrulecolor\myrule}
\newcommand*{\dottedline}{%
  \vbox to \ht\mult@rightbox{\leaders\vbox{\kern.5pt\hbox{.}\kern.5pt}\vfill}%
}
\newcommand*{\myrule}{\dottedline}
\newcommand*{\solidline}{\vrule\@width .5pt}
\newcommand*{\setruletype}[1]{%
  \renewcommand*{\myrule}{#1}
}
\xpatchcmd{\LR@column@boxes}
{\columnseprulecolor\vrule\@width\columnseprule}
{\multicoldivider}
{}{}
\xpatchcmd{\RL@column@boxes}
{\columnseprulecolor\vrule\@width\columnseprule}
{\multicoldivider}
{}{}
\LRmulticolcolumns
\makeatother

\begin{document}

\begin{multicols}{2}
  \lipsum[1]
\end{multicols}

\end{document} 

enter image description here

相关内容