概述

概述

跟进这个答案,我决定将其设为一个新环境。以下是我使用包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}

你会得到这个:

好的

看到位于图片基线上的 和ab吗?现在,删除我提到的两个百分比字符( 之前\begin{tikzpicture}和 之后\end{tikzpicture}),您将获得以下内容:

糟糕

整体占用两行,因为一行\linewidth不够容纳缩进框、、、a两个b单词间距和图像(给定默认值\parindent)。

在 TikZ 中用矢量除以标量

我添加了\pgfmathparse计算和calcTikZ 库,以便对xy向量进行您显然想要的除法。

关于“非空”与“提供”参数检查

请注意:

  • xparse\IfNoValueTF测试不是测试可选参数是否为空,它测试是否已经假如。可以提供一个空参数,它仍然被提供。如果您要决定的标准是空,我建议O{}在参数规范中使用\NewDocumentEnvironment,然后使用例如etoolbox\ifblank命令进行检查(即,1)您将参数声明为可选参数,其默认值为空,2)检查它是否为空)。

  • 使用\IfValueTF而不是\IfNoValueTF可能会使逻辑更容易理解,特别是当有像这样的重叠测试时。

相关内容