在 tikz 中,在节点名称和节点文本中同时使用下划线

在 tikz 中,在节点名称和节点文本中同时使用下划线

我想使用字符串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}

两者应给出相同的结果:

在此处输入图片描述

相关内容