macro chỉ dành cho tikz

Oct 07 2020

Tôi có một macro được viết vì \newcommandnó chứa một môi trường tikz hoàn toàn mới.

Làm thế nào người ta có thể tạo ra một macro từ đó chỉ chứa nội dung của môi trường tikz, để nếu người ta muốn có bản vẽ này nhiều lần, nó được vẽ trong một môi trường tikz duy nhất?

Tôi biết rằng tôi có thể đơn giản loại bỏ phần khai báo về môi trường tikz trong macro của mình, nhưng điều đó cũng sẽ cho phép tôi sử dụng macro bên ngoài môi trường tikz.

Ví dụ:

Tôi có một macro tương tự như macro sau:

\newcommand{\myTikzMacro}{
  \begin{tikzpicture}
    \draw (0,0) rectangle (1,1);
    \draw (1,1) rectangle (2,0);
  \end{tikzpicture}

Bây giờ tôi có thể sử dụng macro nhiều lần sau mỗi lần như thế này:

\myTikzMacro \\
\myTikzMacro \\

Nhưng sau đó nhiều môi trường tikz sẽ được sử dụng. Để tránh điều đó, tôi có thể tạo macro này:

\newcommand{\myTikzMacro2}{
    \draw (0,0) rectangle (1,1);
    \draw (1,1) rectangle (2,0);

Và sử dụng nó như sau:

\begin{tikzpicture}
  \myTikzMacro2
  \myTikzMacro2
\end{tikzpicture}

Nhưng điều này sẽ cho phép tôi sử dụng macro bên ngoài tikzpicturemôi trường mà tôi cũng muốn tránh.

Có cách nào để khai báo macro chỉ khả dụng / hiển thị trong môi trường tikzpicture không? (có thể với pgfkeys)

Trả lời

1 campa Oct 07 2020 at 21:23

Theo Làm thế nào tôi có thể kiểm tra xem mã hiện tại có bên trong một tikzpicture không? tikzcung cấp macro

\tikzifinpicture{true branch}{false branch}

để kiểm tra xem một trong những tikzpicture; Tuy nhiên, các nhận xét trong định nghĩa của nó dường như gây ra một số nghi ngờ về tính đúng đắn của nó. (Tôi tin rằng nó có thể bị lỗi trong các hình ảnh lồng nhau.) Giả sử rằng nó hoạt động trong hầu hết các trường hợp đơn giản mà bạn có thể xác định

\newcommand*{\myTikzPicture}
{\tikzifinpicture
    {%
     \draw (0,0) rectangle (1,1);
     \draw (1,1) rectangle (2,0);
    }%
    {%
     \GenericError{}{Unallowed command}
             {\string\myTikzPicture\space can be used only inside a tikz picture.}{}%
    }%
}

Tôi đã sử dụng ở đây \GenericError. Nếu lệnh sẽ đi vào một gói tùy chỉnh, việc sử dụng \PackageErrorsẽ thích hợp hơn.