我试图引用 中的字符串的第一个字符,但我认为中的pgfmathsetmacro
宏无法很好地兼容。\StrLeft
xstring
pgfmathsetmacro
请看以下重复此问题的示例:
\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”字符中间点开始向下移动 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}
我相信也能感知旅程可能去往何处。你需要小心一点,因为节点有outer
和inner
sep
,这可能会影响位置,但你可以将它们设置为0
。实际上你不需要\pgfmathsemacro
Ti 这个东西钾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{...}{...}
。)