如何将“正多边形边”的参数变成宏?

如何将“正多边形边”的参数变成宏?

我正在使用 Titikz绘制一个正十五边形(即 15 边形)shapes.geometricZ 库。我选择了这个(简化版):

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}
\begin{tikzpicture} 
    \node [
        draw, regular polygon,
        regular polygon sides = 15
    ] at (0,0) {};
\end{tikzpicture}
\end{document}

一切都很好,直到我想到将“神奇数字” 15 包装到宏中。我这样做了:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}
\begin{tikzpicture}
    \def\sides{15}    
    \node [
        draw, regular polygon,
        regular polygon sides = \sides
    ] at (0,0) {};
\end{tikzpicture}
\end{document}

繁荣!!!

! Missing number, treated as zero.
<to be read again> 
                   \relax 
l.12     ] at (0,0) {};

我也尝试过这个:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}
\begin{tikzpicture}
    \newcommand*\sides{15}    
    \node [
        draw, regular polygon,
        regular polygon sides = \sides
    ] at (0,0) {};
\end{tikzpicture}
\end{document}

但它却以同样的方式蓬勃发展。因此:

  1. 为什么这不起作用?我不太明白 :(

  2. 那我该怎么办呢?

我考虑过放一个\tikzset{regular polygon sides = 15},但是因为我需要在其他地方使用这个神奇数字,所以除非我以后可以提取这个数字,否则我不能使用这种方法。

任何帮助都值得感激:)

答案1

这是谜题的解决方案:查看pgflibraryshapes.geometric.code.tex并发现\sides已在内部使用:

683 % Shape Regular Polygon.
684 %
685 \pgfdeclareshape{regular polygon}{%
686     \savedmacro\sides{%
687         \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}%
688     }%

(添加了行号以定位代码)。因此,重新定义\sides很可能会对代码处理产生不利影响。在 PGF 手册的第 1112 页,我们看到

在此处输入图片描述

答案2

为什么不使用math tikzlibrary

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric,math}
\tikzmath{
let \n=15;} 

\begin{document}
\begin{tikzpicture}

    \node [
        draw, regular polygon,
        regular polygon sides = \n
    ] at (0,0) {};
\end{tikzpicture}
\end{document}

答案3

@egreg 很好地解释了错误的原因,这里提供了一个简单的使用方法\sides。你只需要添加.expanded密钥即可。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}
\begin{tikzpicture}
    \newcommand*\sides{15}    
    \node [
        draw, regular polygon,
        regular polygon sides/.expanded=\sides
    ] at (0,0) {};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容