字符串操作在 pgfmathsetmacro 中产生错误

字符串操作在 pgfmathsetmacro 中产生错误

我试图引用 中的字符串的第一个字符,但我认为中的pgfmathsetmacro宏无法很好地兼容。\StrLeftxstringpgfmathsetmacro

请看以下重复此问题的示例:

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{xstring}

    \begin{document}

    \begin{tikzpicture}
        \newcommand{\str}{hello};
        \newcommand{\firstChar}
        {
            \StrLeft{\str}{1}
        };

        \pgfmathsetmacro{\halfStr}{width("\str") * 1pt / 2cm};
        \pgfmathsetmacro{\halfFirstChar}{width("\firstChar") * 1pt / 2cm};

        \node at (0, 0) {\str};
        \draw [color=black] (\halfFirstChar - \halfStr, 0cm) -- (\halfFirstChar - \halfStr,-1cm);
    \end{tikzpicture}

    \end{document}

以下代码应输出以下内容:

“hello”中“h”中间的垂直线。

(打印字符串“hello”,同时打印一条从“h”字符中间点开始向下移动 1 厘米的垂直线。)

但是,\halfFirstChar会产生如下错误:

\reserved@a 的参数有一个额外的 }。失控参数?额外的 },或被遗忘的 \endgroup。

\firstChar通过执行以下操作,我可以无问题地进行打印:

    % ...
    \node at (0, 0) {\firstChar};
    % ...

但是,我无法\firstChar在内引用\halfFirstChar有谁知道可能导致此错误的原因以及解决此问题的方法?

答案1

由于扩展问题,这有点棘手。使其工作的最简单方法可能是使用可选参数来\StrLeft定义\firstChar。然后我认为其余部分就可以正常工作了。

\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}

\begin{document}

\begin{tikzpicture}
    \newcommand{\str}{hello}
    \StrLeft{\str}{1}[\firstChar]
    \pgfmathsetmacro{\halfStr}{width("\str") * 1pt / 2cm};
    \pgfmathsetmacro{\halfFirstChar}{width("\firstChar") * 1pt / 2cm};

    \node at (0, 0) {\str};
    \draw [color=black] (\halfFirstChar - \halfStr, 0cm) -- (\halfFirstChar - \halfStr,-1cm);
\end{tikzpicture}
\end{document}

在此处输入图片描述

我相信也能感知旅程可能去往何处。你需要小心一点,因为节点有outerinner sep,这可能会影响位置,但你可以将它们设置为0。实际上你不需要\pgfmathsemacroTi 这个东西Z 解析器非常通用,它甚至理解pt

\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}

\begin{document}

\begin{tikzpicture}
    \newcommand{\str}{hello}
    \StrLeft{\str}{1}[\firstChar]
    \node[inner sep=0] at (0, 0) {\str};
    \draw [color=black] ({(width("\firstChar")/2-width("\str")/2)*1pt}, 0cm) 
    -- ++ (0,-1cm);
\end{tikzpicture}
\end{document}

当然,您可以在节点中更改字体大小,这也可能影响这些技巧。我实际上想知道您是否想看看库tikzmark并检查那里做了什么。(顺便说一句,您不需要;after \newcommand{...}{...}。)

相关内容