这是使边注出现在两栏、双面文档的两侧, 考虑在内\section 之后的 Marginnote:如何防止分页?(主要区别在于使用\strut
而不是\needspace
)。
在此 MWE 中,注释出现在错误的列中:
\documentclass[twocolumn,twoside]{article}
\usepackage{lipsum}
\usepackage{marginnote}
\makeatletter
\let\oldmarginnote\marginnote
\renewcommand*{\marginnote}[1]{%
\strut%
\begingroup%
\ifodd\value{page}
\if@firstcolumn\reversemarginpar\fi
\else
\if@firstcolumn\else\reversemarginpar\fi
\fi
\oldmarginnote{#1}%
\endgroup%
}
\makeatother
\begin{document}
\lipsum[4-6]
\lipsum[6]
\marginnote{Note on wrong column}
Text with note
\end{document}
这似乎是 的一个问题\if@firstcolumn
。如何修复?
答案1
您的代码无法运行,并且您链接的答案是错误的。可以通过以下示例看到问题:
\documentclass[twocolumn,twoside]{article}
\usepackage{lipsum}
\usepackage{marginnote}
\makeatletter
\let\oldmarginnote\marginnote
\renewcommand*{\marginnote}[1]{%
\begingroup\strut
\if@firstcolumn
\reversemarginpar
\oldmarginnote{first #1}%
\else
\normalmarginpar
\oldmarginnote{second #1}%
\fi
\endgroup%
}
\makeatother
\begin{document}
blalla\marginnote{text 1}
\lipsum[4-6]
\lipsum[6]
\marginnote{text 2}%
Text with note
\marginnote{text 3}%
Text with note
\end{document}
由于 tex 的异步页面构建,边注“测试 2”认为它位于第 1 列。
正确检测当前列并不容易(参见例如检测多列中的当前列)。
在您的情况下,您可以使用 zref-savepos(我通过查看辅助中的“stop”和“start2”的位置找到了值 19000000。这可以改进):
\documentclass[twocolumn,twoside]{article}
\usepackage{lipsum}
\usepackage{marginnote,zref-savepos}
\newcounter{labelnote}
\makeatletter
\let\oldmarginnote\marginnote
\renewcommand*{\marginnote}[1]{%
\begingroup\strut
\stepcounter{labelnote}\zsaveposx {marginnote-\thelabelnote}
\ifnum 0\zposx{marginnote-\thelabelnote}<19000000
\reversemarginpar
\oldmarginnote{first #1}%
\else
\normalmarginpar
\oldmarginnote{second #1}%
\fi
\endgroup%
}
\makeatother
\begin{document}
%\noindent\zsaveposx{start}x\hfill y\zsaveposx{stop}
blalla\marginnote{text 1}
\lipsum[4-6]
\lipsum[6]
\marginnote{text 2}%
Text with note
\marginnote{text 3}%
Text with note
%\noindent\zsaveposx{start2}x\hfill y\zsaveposx{stop2}
\end{document}
答案2
Tikz[记住图片,叠加]通过每次将原点和页码写入辅助文件来提供准确的位置信息。因此,需要运行两次才能使其正常工作。
\documentclass[twocolumn,twoside]{article}
\usepackage{lipsum}
\usepackage{marginnote}
\usepackage{tikzpagenodes}
\newlength{\tempdima}
\newcount{\tikzpage}
\makeatletter
\let\oldmarginnote\marginnote
\renewcommand*{\marginnote}[1]{%
\begin{tikzpicture}[remember picture, overlay]%
\pgfextractx{\tempdima}{\pgfpointanchor{current page text area}{center}}%
\global\tempdima=\tempdima
\global\tikzpage=\oddpage@page
\end{tikzpicture}%
\begingroup
\ifodd\tikzpage\relax
\ifdim\tempdima>0pt \reversemarginpar\fi
\else
\ifdim\tempdima<0pt \reversemarginpar\fi
\fi
\oldmarginnote{#1}%
\endgroup% resets \reversemarginpar
}
\makeatother
\begin{document}
\marginnote{left}
\lipsum[4-6]
\lipsum[6]
\marginnote{right}
Text with note
\end{document}