如何知道文本位于哪一列

如何知道文本位于哪一列

我想在双栏文档的页边空白处放置一个带有字母的小圆圈。为了确定此项目符号放在哪个页边空白处,我使用\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 坐标(LEFTRIGHT)。此 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}

相关内容