使用 tikz 检测页面的一侧

使用 tikz 检测页面的一侧

我想定义一个宏\mymark来在边缘处生成一个简单的小块tikzpicture,位于最接近文本中调用宏的位置的一侧。

我目前有的是:

\documentclass{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}

\newlength{\markshift}
\setlength{\markshift}{\paperwidth}
\addtolength{\markshift}{-\textwidth}
\setlength{\markshift}{.5\markshift}
\addtolength{\markshift}{-.5cm}


\newcommand{\mymark}{%
  \textbf{MARK}% just to see where the measurement is taken
  \tikz[remember picture,overlay,baseline=-2.5pt]{
    \coordinate(mymark);
    \path let \p1 = (current page.north), \p2 = (mymark) in \pgfextra{
      \pgfmathparse{(\x1-\x2)>0 ? "west" : "east"}
      \global\let\mymarkside\pgfmathresult
      \pgfmathparse{(\x1-\x2)>0 ? \markshift : -\markshift}
      \global\let\mymarkoffset\pgfmathresult
    };
  }%
  \tikz[remember picture,overlay]
    \fill(mymark -| current page.\mymarkside) ++(\mymarkoffset pt,0)
      circle[radius=3pt];%
}

\begin{document}
\lipsum*[2]
\mymark
\lipsum*[4]
\mymark
\lipsum[1]
\end{document}

这样做效果很好,但感觉有点麻烦(所有pgfextra\global业务似乎都是多余的)。有没有更直接的方法来实现相同的结果?

例子

答案1

我认为这正是\pgfextra{}(好吧,也许不是确切地,但您知道我的意思)。不过,可以使您的代码稍微短一些。

首先,你不需要\coordinate (mymark),因为它的位置始终是(0,0)。出于同样的原因,你只需要检查 是否\x1大于 0。此外,如果你停留在一个 pgf 范围内,则不需要\globals 。这也意味着你\mymarkoffset根本不需要。

完整代码(结果与您发布的屏幕截图相同):

\documentclass{article}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}

\newlength{\markshift}
\setlength{\markshift}{\paperwidth}
\addtolength{\markshift}{-\textwidth}
\setlength{\markshift}{.5\markshift}
\addtolength{\markshift}{-.5cm}

\newcommand{\mymark}{%
    \textbf{MARK}% just to see where the measurement is taken
    \tikz[remember picture,overlay,baseline=-2.5pt]{
        \fill let \p1 = (current page.north) in \pgfextra{
            \pgfmathparse{\x1>0 ? "west" : "east"}
            \let\mymarkside\pgfmathresult
            \pgfmathparse{\x1>0 ? 1 : -1}
        } (0,0 -| current page.\mymarkside) ++(\pgfmathresult*\markshift,0) circle[radius=3pt];
    }%
}

\begin{document}
\lipsum*[2]
\mymark
\lipsum*[4]
\mymark
\lipsum[1]
\end{document}

编辑2
在@percusse 的帮助下,它几乎变成了一行:

\newcommand{\mymark}{%
    \textbf{MARK}% just to see where the measurement is taken
    \tikz[remember picture,overlay,baseline=-2.5pt]{
        \fill[black] let \p1=(current page.north), \n1={\x1 > 0 ? 180 : 0} in (0,0 -| current page.\n1) ++ (\n1+180:\markshift) circle[radius=3pt];
    }%
}

结果还是一样。

相关内容