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}
输出:
答案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}