我在两列布局中使用了边注包。下面提到的命令不会触发左右两列。
\ifodd\value{page}
\if@firstcolumn\reversemarginpar\else\normalmarginpar\fi
\else
\if@firstcolumn\reversemarginpar\else\normalmarginpar\fi
\fi
这个“if then else”条件对我来说不起作用。
平均能量损失
\documentclass[twocolumn]{article}
\usepackage{multicol}
\usepackage{lipsum}
\usepackage{marginnote}
\makeatletter
\let\oldmarginnote\marginnote
\renewcommand*{\marginnote}[1]{%
\begingroup%
\ifodd\value{page}
\if@firstcolumn\reversemarginpar\fi
\else
\if@firstcolumn\else\reversemarginpar\fi
\fi
\oldmarginnote{#1}%
\endgroup%
}
\makeatother
\begin{document}
\lipsum[1]\marginnote{Odd page left side note}[-50pt]
\lipsum[2]
\lipsum[3]
\lipsum[4]\marginnote{Odd page right side note}[-50pt]
\lipsum[5]
\lipsum[6]
\lipsum[7]\marginnote{even page left side note}
\lipsum[8]
\lipsum[9]
\lipsum[10]
\lipsum[11]
\lipsum[12]
\lipsum[13]
\lipsum[14]\marginnote{even page right side note}
\lipsum[15]
\lipsum[16]
\lipsum[17]
\clearpage
\onecolumn
\begin{multicols}{2}
\section{Multicol environment begins}
\lipsum[10]\marginnote{Multicol left side note}
\lipsum[11]
\lipsum[12]
\lipsum[13]
\lipsum[14]
\lipsum[15]
\lipsum[16]\marginnote{Multicol right side note}
\lipsum[17]
\end{multicols}
\end{document}
目前我正在使用手动给定的\reversemarginpar
和\normalmarginpar
。我的要求是自动触发器在 if then else 条件下工作。请提供建议。
答案1
该multicol
包有一个colaction
选项。然后您可以使用该命令执行与列相关的操作\docolaction
。三个参数分别是针对第一列、中间列和最后一列的操作。
这是一个简单版本,但它不处理可选参数marginnote
(位于强制参数之后,而不是之前)。
\documentclass{article}
\usepackage[colaction]{multicol}
\usepackage{lipsum}
\usepackage{marginnote}
\let\oldmarginnote\marginnote
\renewcommand{\marginnote}[1]
{\begingroup\docolaction{\reversemarginpar}{}{}\oldmarginnote{#1}\endgroup}
\begin{document}
\begin{multicols}{2}
\section{Multicol environment begins}
\lipsum[10]\marginnote{lipsum 10}
\lipsum[11]\marginnote{lipsum 11}
\lipsum[12]\marginnote{lipsum 12}
\lipsum[13]\marginnote{lipsum 13}
\lipsum[14]\marginnote{lipsum 14}
\lipsum[15]\marginnote{lipsum 15}
\lipsum[16]\marginnote{lipsum 16}
\lipsum[17]\marginnote{lipsum 17}
\end{multicols}
\end{document}
为了处理可选参数,我们必须深入包内部并更改实际执行工作的低级命令:
\documentclass{article}
\usepackage[colaction]{multicol}
\usepackage{lipsum}
\usepackage{marginnote}
\makeatletter
\let\old@mn@@@marginnote\@mn@@@marginnote
\long\def\@mn@@@marginnote[#1]#2[#3]{%
\begingroup
\docolaction{\reversemarginpar}{}{}\old@mn@@@marginnote[{#1}]{#2}[{#3}]%
\endgroup}
\makeatother
\begin{document}
\begin{multicols}{2}
\section{Multicol environment begins}
\lipsum[10]\marginnote{lipsum 10}[-30pt]
\lipsum[11]\marginnote{lipsum 11}
\lipsum[12]\marginnote{lipsum 12}
\lipsum[13]\marginnote{lipsum 13}[-30pt]
\lipsum[14]\marginnote{lipsum 14}
\lipsum[15]\marginnote{lipsum 15}[-30pt]
\lipsum[16]\marginnote{lipsum 16}[-30pt]
\lipsum[17]\marginnote{lipsum 17}
\end{multicols}
\end{document}
答案2
alephzero 的答案通常很有效(在安装最新版本后multicol
),但就我而言存在一个主要问题:对于双面文档,它在奇数页上工作正常,但在偶数页上marginnotes
会尝试自动反转它使用的一面,导致右列的注释显示在左侧,反之亦然。
可以使用\checkoddpage
内置于memoir
或的来纠正此问题可以从 changepage 包中获取– 您可以简单地反转偶数页上相反列的注释。我没有使用可选参数marginnote
,因此我坚持使用第一个版本并使用:
\usepackage{marginnote}
\let\oldmarginnote\marginnote
\strictpagecheck
\renewcommand{\marginnote}[1]
{%
\checkoddpage%
\ifoddpage%
{\begingroup\docolaction{\reversemarginpar}{}{}\oldmarginnote{#1}\endgroup}%
\else{%
{\begingroup\docolaction{}{}{\reversemarginpar}\oldmarginnote{#1}\endgroup}}%
\fi%
}
编辑:声明很重要\strictpagecheck
,否则页面第一部分的标题可能会出现在错误的一侧。