Tikz 和基本扩展问题

Tikz 和基本扩展问题

我几乎无法理解 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}

也等待其他人,因为我相信还有更多方法。

相关内容