我几乎无法理解 LaTeX 如何使用扩展,这里是另一个我无法解决问题的例子。
以下是 MWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\myPos}[2]{$(current page.north west) + (#1\paperwidth,-#2\paperheight)$}
\newcommand{\addWholePictureG}[5]{%
\belowCrop{%
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0pt,anchor=#3]() at (#4)
{\includegraphics[width=#1,height=#2,keepaspectratio]{#5}};
\end{tikzpicture}
}
}
\begin{document}
% Works:
\addFillPictureG{6cm}{6cm}{center}{$(current page.north west) + (.5\paperwidth,-.5\paperheight)$}{}{20160724_184636.jpg}
\addFillPictureG{6cm}{6cm}{center}{current page.south}{}{20160724_184636.jpg}
% Does *not* work
\addFillPictureG{6cm}{6cm}{center}{\myPos{.5}{.5}}{}{20160724_184636.jpg}
\end{document}
myPos
应该是一个简单的替换,但是替换似乎很糟糕,因为它失败并出现错误:
ERROR: Package pgf Error: No shape named $(current page is known.
--- TeX said ---
See the pgf package documentation for explanation.
Type H <return> for immediate help.
...
l.16 ...p=0pt,anchor=center]() at (\myPos{.5}{.5})
{Hi};
我尝试玩expandafter
一些东西,但没有结果。有什么想法吗?
谢谢 !
答案1
这里的一个解决方案是使用at
节点选项中的键并使用.expanded
处理程序。这将有效地使用\edef
参数:
\newcommand{\addFillPictureG}[5]{%
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0pt,anchor=#3, at/.expanded={(#4)}]
{\includegraphics[width=#1,height=#2,keepaspectratio]{#5}};
\end{tikzpicture}
}
因此,类似于:
\addFillPictureG{6cm}{6cm}{center}{\myPos{.5}{.5}}{some_image.jpg}
应该可以工作(只要some_image.jpg
文件系统可用)。
答案2
看起来 tikzpicture($()$)
在扩展其环境内的命令之前会先查找整体。
因此你可以这样做:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\myPos}[2]{#1,#2}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0pt,anchor=center]() at ($(\myPos{5}{3})$){Hi(5,3)};
\node[inner sep=0pt,anchor=center]() at ($(\myPos{0}{0})$){Hi(0,0)};
\end{tikzpicture}
\end{document}
($()$) 中包含的必须是两个或三个数字,表示点的坐标。
编辑:
第二种方法是使用\xdef
或 \newcommand 来扩展该点,例如:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\myPos}[2]{#1,#2}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\xdef\myPoint{\myPos{5}{3}}
\node[inner sep=0pt,anchor=center](A) at (\myPoint) {Hi(5,3)};
\node[inner sep=0pt,anchor=center]() at (\myPos{0}{0}){Hi(0,0)};
\end{tikzpicture}
\end{document}
对于更复杂的计算,你可以这样做:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\myPos}{current page.center}
\newcommand{\myP}[2]{#1,#2}
\begin{document}
% Works:
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0pt,anchor=center]() at ($(current page.center)$){Hi};
\end{tikzpicture}
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0pt,anchor=center](A) at ($(\myPos)+(\myP{9}{3})$) {Hi(9,3)};
\end{tikzpicture}
\end{document}
也等待其他人,因为我相信还有更多方法。