![在 tikz 中,在节点名称和节点文本中同时使用下划线](https://linux22.com/image/437385/%E5%9C%A8%20tikz%20%E4%B8%AD%EF%BC%8C%E5%9C%A8%E8%8A%82%E7%82%B9%E5%90%8D%E7%A7%B0%E5%92%8C%E8%8A%82%E7%82%B9%E6%96%87%E6%9C%AC%E4%B8%AD%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF.png)
我想使用字符串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}
两者应给出相同的结果: