我想使用字符串a_b
作为节点名称和节点文本,用xelatex实现。
定义了一个在节点名称和节点文本上使用相同字符串的新命令:
\newcommand\block[1][ ]{\node[rectangle,draw](#1){#1}}
关于下划线的一个问题是:
- 我必须在节点文本中转义下划线,因为我想在节点中打印“a_b”
- 我无法在节点名称中转义下划线
因此,要么\block[a\_b]
,要么\block[a_b]
都会出错。
保留命令时可以使用下划线吗\block
?
答案1
欢迎来到 TeX.SX!如果您只想使用不包含任何附加宏的纯表达式(例如a_b
或类似表达式)来使其工作,则可以使用该xstring
包将节点文本中的下划线替换为其等效宏,如下所示:
\documentclass[tikz, border=2mm]{standalone}
\usepackage{xstring}
\newcommand\block[1][ ]{%
\node[rectangle,draw](#1){\StrSubstitute{#1}{_}{\textunderscore}};%
}
\begin{document}
\begin{tikzpicture}
\block[a_b]
\end{tikzpicture}
\end{document}
但是,正如 daleif 在他们的评论中指出的那样,只需使用\detokenize{#1}
就可以完成这项工作:
\documentclass[tikz, border=2mm]{standalone}
\newcommand\block[1][ ]{%
\node[rectangle,draw](#1){\detokenize{#1}};%
}
\begin{document}
\begin{tikzpicture}
\block[a_b]
\end{tikzpicture}
\end{document}
两者应给出相同的结果: