跟进这个答案,我决定将其设为一个新环境。以下是我使用包xparse
和的MWE tikz
:
\documentclass[10pt,a4paper]{article}
\usepackage{xparse,tikz}
\NewDocumentEnvironment{overdraw}{ o o m +b } {
{ % begin "\begin{overdraw}"
\begin{tikzpicture}
\node[anchor=south west, inner sep = 0] (image) at (0,0) {
\includegraphics{#3}
}; % add image at coordinate (0, 0)
\IfNoValueTF{#2} {
\IfNoValueTF{#1} {
\begin{scope}[x={(image.south east)},y={(image.north west)}]
% If Optional Arg #1 is empty
} { \begin{scope}[x={(image.south east)/#1},y={(image.north west)}] }
% #1 not empty
} % If Optional Arg #2 is empty
{ \begin{scope}[x={(image.south east)/#1},y={(image.north west)/#2}] }
% #2 not empty
} % end "\begin{overdraw}"
{ % begin "\end{overdraw}"
\end{scope}
\end{tikzpicture}
} % end "\end{overdraw}"
}
\begin{document}
\begin{overdraw}{sample.jpg}
\draw[red,ultra thick,rounded corners] (0.62,0.65) rectangle (0.78,0.75);
\end{overdraw}
\end{document}
编译此代码会返回一条错误消息:
pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has
been already used, duplicate ignored
<to be read again>
\relax
l.16 \newpage
[1]
! Package tikz Error: A node must have a (possibly empty) label text.
See the tikz package documentation for explanation.
Type H <return> for immediate help.
...
l.20 \end
{overdraw}
?
! Emergency stop.
...
l.20 \end
{overdraw}
End of file on the terminal!
这\newpage
和我写的有什么关系?有什么办法可以解决这个问题吗?
编辑:可以找到完整的软件包存储库Github 上的链接欢迎路人留下评论和笔记,了解如何管理和开发一个好的包裹:D
答案1
概述
x
您遇到了括号匹配问题,并且和向量上的除法y
是以 TikZ 不支持的方式编写的。以下方法对我有用。我已删除您的+b
参数说明符,因为您根本不使用此参数。
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}
\NewDocumentEnvironment{overdraw}{ o o m }%
{%
\begin{tikzpicture}
\node[anchor=south west, inner sep = 0] (image) at (0,0) {
\includegraphics{#3}
}; % add image at coordinate (0, 0)
\IfNoValueTF{#2} {% optional argument #2 not provided
\IfNoValueTF{#1} {% optional argument #1 not provided
\begin{scope}[x={(image.south east)},y={(image.north west)}]
}{% #1 provided
\pgfmathparse{1/(#1)}
\begin{scope}[x={($\pgfmathresult*(image.south east)$)},
y={(image.north west)}]
}
}{% #2 provided
\pgfmathsetmacro{\myXfactor}{1/(#1)}
\pgfmathsetmacro{\myYfactor}{1/(#2)}
\begin{scope}[x={($\myXfactor*(image.south east)$)},
y={($\myYfactor*(image.north west)$)}]
}
}{
\end{scope}
\end{tikzpicture}%
}% end "\end{overdraw}"
\begin{document}
\begin{overdraw}[1.5][0.8]{example-image}
\draw[red,ultra thick,rounded corners] (0.62,0.65) rectangle (0.78,0.75);
\end{overdraw}
\end{document}
代码格式和多余的空格
我重新格式化了代码,使其更易于阅读(IMHO)。注意不要引入多余的空格,因为您不是在这里使用(请注意环境开始时,before 处以及环境结束时,after 处字符\ExplSyntaxOn
的位置)。要了解我的观点,请尝试使用以下代码:%
\begin{tikzpicture}
\end{tikzpicture}
\begin{document}
a\begin{overdraw}{example-image}
\draw[red,ultra thick,rounded corners] (0.62,0.65) rectangle (0.78,0.75);
\end{overdraw}b
\end{document}
你会得到这个:
看到位于图片基线上的 和a
了b
吗?现在,删除我提到的两个百分比字符( 之前\begin{tikzpicture}
和 之后\end{tikzpicture}
),您将获得以下内容:
整体占用两行,因为一行\linewidth
不够容纳缩进框、、、a
两个b
单词间距和图像(给定默认值\parindent
)。
在 TikZ 中用矢量除以标量
我添加了\pgfmathparse
计算和calc
TikZ 库,以便对x
和y
向量进行您显然想要的除法。
关于“非空”与“提供”参数检查
请注意:
xparse
的\IfNoValueTF
测试不是测试可选参数是否为空,它测试是否已经假如。可以提供一个空参数,它仍然被提供。如果您要决定的标准是空,我建议O{}
在参数规范中使用\NewDocumentEnvironment
,然后使用例如etoolbox
的\ifblank
命令进行检查(即,1)您将参数声明为可选参数,其默认值为空,2)检查它是否为空)。使用
\IfValueTF
而不是\IfNoValueTF
可能会使逻辑更容易理解,特别是当有像这样的重叠测试时。