我想在双栏文档的页边空白处放置一个带有字母的小圆圈。为了确定此项目符号放在哪个页边空白处,我使用\if@firstcolumn
。
大部分时候都能用,但有时候在新栏目第一段就出错了。\if@firstcolumn
更新似乎有点延迟。
twocolumn
我目前使用选项article
。我不打算切换到包multicol
,似乎有一个解决方案可用这里。
我怎样才能真正知道当前的列?
我的 MWE。我不想要红色箭头;它只是为了可视化。此代码实际上放置了一个项目符号列表。此 MWE 从第二页开始产生问题。
\documentclass[12pt,a4paper,twocolumn]{article}
\usepackage[utf8]{inputenc}
\usepackage[paper height = 10cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc, tikzmark}
\newcounter{nivel}
\makeatletter
\newcommand{\niveis}[1]{%
\if@twocolumn%
\if@firstcolumn%
\def\ancora{east}%
\def\margem{west}%
\def\deslocamento{+2.25cm}%
\else%
\def\ancora{west}%
\def\margem{east}%
\def\deslocamento{-2.25cm}%
\fi%
\fi%
\stepcounter{nivel}%
\tikzmark{exercicio-\thenivel}%
\begin{tikzpicture}[overlay, remember picture,
every node/.style = {
align = center,
font=\footnotesize\bfseries\sffamily\color{white},
anchor = center,
},
]
\coordinate (base) at
($(current page.\margem|-{pic cs:exercicio-\thenivel})
+ (\oddsidemargin+\hoffset\deslocamento, 0)$);
\foreach \n[count = \k from 0] in {#1}{
\coordinate (item) at ($(base) - (0, 0.6cm * \k)$);
\draw[thick, red, <-] ({pic cs:exercicio-\thenivel}) -- (item);
\path[fill = black!75] (item) circle (0.25cm);
\node at (item) {\n};
}
\end{tikzpicture}%
}
\newcommand{\whichcolumn}{\if@firstcolumn LEFT\else RIGHT\fi}
\makeatother
\begin{document}
\foreach \i in {1, ..., 50}{
\whichcolumn (\i)\niveis{A, B} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Um enim ad minim veniam, quis nostrud exercitation ullamco is in the \whichcolumn\ column.\par%
}
\end{document}
答案1
以下代码改编使用zref
模块savepos
存储您要放置的文本左侧的 x 坐标(LEFT
或RIGHT
)。此 x 坐标用于识别您是在左列还是右列,具体取决于它是否小于或大于(或等于)页面宽度的 50%。由于您使用的是tikz
你已经可以使用tikzmark
也一样。我只是没有那么熟悉zref-savepos
。
在第一次编译时,所有元素都被视为LEFT
,因为 x 坐标尚未成功存储和调用。在接下来的几次编译中,这种情况会发生变化,元素会根据RIGHT
需要转移到 。这会增加某些段落中的文本,导致左/右列之间的溢出不同,从而导致tikz
箭头和文本框的位置不同。简而言之,您必须编译几次,直到这些引用“稳定下来”。一旦这种情况发生,只有标记位置的变化才可能导致额外的编译。
\documentclass[12pt,a4paper,twocolumn]{article}
\usepackage[paper height = 10cm]{geometry}
\usepackage{zref-savepos}
\newcounter{columncheck}
\usepackage{tikz}
\usetikzlibrary{calc, tikzmark}
\newcounter{nivel}
\makeatletter
\newcommand{\niveis}[1]{%
\if@twocolumn%
\leftorright{%
\def\ancora{east}%
\def\margem{west}%
\def\deslocamento{+2.25cm}%
}{%
\def\ancora{west}%
\def\margem{east}%
\def\deslocamento{-2.25cm}%
}%
\fi%
\stepcounter{nivel}%
\tikzmark{exercicio-\thenivel}%
\begin{tikzpicture}[overlay, remember picture,
every node/.style = {
align = center,
font=\footnotesize\bfseries\sffamily\color{white},
anchor = center,
},
]
\coordinate (base) at
($(current page.\margem|-{pic cs:exercicio-\thenivel})
+ (\oddsidemargin+\hoffset\deslocamento, 0)$);
\foreach \n[count = \k from 0] in {#1}{
\coordinate (item) at ($(base) - (0, 0.6cm * \k)$);
\draw[thick, red, <-] ({pic cs:exercicio-\thenivel}) -- (item);
\path[fill = black!75] (item) circle (0.25cm);
\node at (item) {\n};
}
\end{tikzpicture}%
}
\newcommand{\whichcolumn}{%
\stepcounter{columncheck}%
\zsaveposx{columncheck-\thecolumncheck}%
\ifdim.5\paperwidth > \zposx{columncheck-\thecolumncheck}sp
LEFT%
\let\leftorright\@firstoftwo
\else
RIGHT%
\let\leftorright\@secondoftwo
\fi
}
\makeatother
\begin{document}
\foreach \i in {1, ..., 50}{
\mbox{}\whichcolumn (\i)\niveis{A, B} Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Um enim ad minim veniam, quis nostrud exercitation ullamco is in the \whichcolumn\ column.\par%
}
\end{document}