我想定义一个宏\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 范围内,则不需要\global
s 。这也意味着你\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];
}%
}
结果还是一样。