如何在两栏布局中触发边注

如何在两栏布局中触发边注

我在两列布局中使用了边注包。下面提到的命令不会触发左右两列。

\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,否则页面第一部分的标题可能会出现在错误的一侧。

相关内容