代码:
\documentclass[12pt]{article}
\usepackage{pgfplots}
\usepackage{float}
\pgfplotsset{compat=1.17}
\usepackage{tikz}
\usetikzlibrary{shapes, arrows.meta, automata, positioning, matrix, calc}
\usepackage[RPvoltages, american,siunitx]{circuitikz}
\usepackage[margin=1in]{geometry}
\begin{document}
\begin{figure}[H]\centering
\begin{tikzpicture}
\def\inRad{5};
\def\outDist{3};
\node[draw, circle, minimum size = \inRad cm](spacer){}; %5cm is diameter, not radius
\def\angVal1{90};
\draw(spacer.\angVal1) -- ++(\angVal1:\outDist cm) coordinate (place1);
\def\angVal2{60};
\draw(place1) arc(\angVal1 : \angVal2 :\inRad*.5cm + \outDist cm) coordinate (place2) -- (spacer.\angVal2);
\end{tikzpicture}
\end{figure}
\end{document}
输出:
期望:
有没有办法在命令的角度参数中使用宏常量arc
?或者声明为函数的常量是唯一的选择?
答案1
在 TeX 中,控制字标记可以通过 3 种方式产生:
- 控制字标记可以作为宏的替换文本的一部分出现。
- 控制字标记可以通过扩展
\csname..\endcsname
-表达式而产生。(您可以将\ifcsname..\endcsname
εTeX 扩展视为其变体。) - 当 TeX 读取并标记来自 .tex-input-file 的输入时,控制字标记就会产生。
当 TeX 对来自 .tex 输入文件的输入进行标记(方式 3)时,只有类别代码 11(字母)的字符才会被视为控制字标记名称的组成部分。
数字字符,,,,,,,,,,0
通常有类别代码12 (其他)。1
2
3
4
5
6
7
8
9
类别代码为 10(空格)的字符(通常空格字符和水平制表符属于该类别代码)在 .tex 输入文件中位于被标记为控制字标记的字符序列之后,将被“删除”,即不产生任何标记。
类别代码为 10(空格)的字符位于被标记为控制字标记或空格标记以外的其他标记的字符序列之后,通常会产生显式空格标记,即类别代码为 10(空格)和字符代码为 32 的字符标记。(当 TeX 处于水平模式或受限水平模式时,显式空格标记反过来可能会产生水平粘连。)
因此,从 .tex 输入文件读取并标记序列\angVal1
通常会产生一个控制字标记,\angVal
后跟一个字符标记,后跟一个明确的空格标记。112(other)
使用 tikz 时需要单个控制序列标记。
正如已经提出的其他答案一样,您可以将 更改\angVal1
为\angValA
并\angVa2
更改为\angValB
:
在读取和标记来自 .tex-input 文件(方法 3)的输入时,序列中除反斜杠之外的所有字符都\angValA
具有\angValB
类别代码 11(字母)。因此,TeX 将把来自 .tex-input-file 的序列标记\angValA
为单个控制字标记\angValA
,并将来自 .tex-input-file 的序列标记\angValB
为单个控制字标记\angValB
。这些序列末尾的空格字符将被删除,因为它们跟在被标记为控制字标记的内容后面。
或者,您可以让 TeX 从 -expression 为您创建控制字标记\csname..\endcsname
(方法 2)。(方法 3 的规则不适用于方法 2。)
我不喜欢打字,而且可能一直喜欢\csname..\endcsname
进行大量的扩展/欺骗。\expandafter
因此,在下面的例子中,我使用了一个\NameToCsToken
“内部”适用的宏\csname..\endcsname
。
使用方法如下:
\NameToCsToken⟨emptiness or tokens not in curly braces⟩{⟨NameOfCs⟩}
→
⟨emptiness or tokens not in curly braces⟩\NameOfCs
例如,
\NameToCsToken\newcommand*{macro?_42} ...
→
\newcommand*\macro?_42 ...
; \macro?_42
是单个控制字标记,其名称为macro?_42
。
或者,将左花括号之前的部分留空:
\NameToCsToken{macro?_42}
→
\macro?_42
; \macro?_42
是单个控制字标记,其名称为macro?_42
。
\documentclass[12pt]{article}
\csname @ifdefinable\endcsname\NameToCsToken{\long\def\NameToCsToken#1#{\romannumeral0\innerNameToCsToken{#1}}}%
\newcommand\innerNameToCsToken[2]{\expandafter\exchange\expandafter{\csname#2\endcsname}{ #1}}%
\newcommand\exchange[2]{#2#1}%
\usepackage{pgfplots}
\usepackage{float}
\pgfplotsset{compat=1.17}
\usepackage{tikz}
\usetikzlibrary{shapes, arrows.meta, automata, positioning, matrix, calc}
\usepackage[RPvoltages, american,siunitx]{circuitikz}
\usepackage[margin=1in]{geometry}
\begin{document}
\begin{figure}[H]\centering
\begin{tikzpicture}
\def\inRad{5}\def\outDist{3}%
\NameToCsToken\def{angVal1}{90}%
\NameToCsToken\def{angVal2}{60};
\node[draw, circle, minimum size = \inRad cm](spacer){}; %5cm is diameter, not radius
\draw(spacer.\NameToCsToken{angVal1}) -- ++(\NameToCsToken{angVal1}: \outDist cm) coordinate (place1);
\draw(place1) arc(\NameToCsToken{angVal1}: \NameToCsToken{angVal2}: \inRad*.5cm + \outDist cm) coordinate (place2) -- (spacer.\NameToCsToken{angVal2});
\end{tikzpicture}
\end{figure}
\end{document}