我正在创建一个 tikzposter(使用 Xelatex),我希望在其中排列多个文本节点,以便文本自动垂直定位,例如
R i c h a r d
我找到了许多建议,但它们导致文本旋转。
我发现最接近的方法是使用 parbox 并在每个字母之间添加空格
\draw(270mm,158mm) node {\parbox{3pt}{R i c h a r d}};
但是,由于目的是自动从名称输入文件中绘制节点,因此我宁愿避免这种情况。有人能建议更好的方法吗?
答案1
我在调整宽度。你可以使用 0pt,但结果框的宽度也是零。所以我用了 1em,并在每个字母后强制换行。我还将字母置于框的中央。
\documentclass{article}
\usepackage{tikz}
\newcommand{\splitter}[1]{\splitterparse#1\END}
\def\splitterparse#1{\ifx\END#1
\strut\vspace{-\baselineskip}%
\else
\null\hfil#1\newline
\expandafter\splitterparse
\fi}
\def\END{\END}% do not expand! (Any unique string will do.)
\begin{document}
\tikz{\node[draw, inner sep=0pt]{\parbox{1em}{\splitter{Richard}}}}
\end{document}
答案2
事实上,你可以定义自己的宏来在字母之间添加空格。例如,这样:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\newcommand{\vpar}[1]{\parbox{3pt}{\makevpar#1\relax}}
\newcommand{\makevpar}[1]{\ifstrequal{#1}{\relax}{}{#1 \makevpar}}
\begin{document}
\begin{tikzpicture}
\draw(270mm,158mm) node {\vpar{Richard}};
\draw(280mm,158mm) node {\vpar{Steven}};
\draw(290mm,158mm) node {\vpar{Arnold}};
\draw(300mm,158mm) node {\vpar{Micka{\"e}l}};
\end{tikzpicture}
\end{document}
结果是
答案3
每次吸收一个字母并制作表格。可选参数用于根据上下文进行垂直对齐。
\documentclass{article}
\makeatletter
\newcommand{\verticaltext}[2][c]{%
\if\relax\detokenize{#2}\relax\else
\vertical@text{#1}#2\@nil
\fi
}
\def\vertical@text#1#2#3\@nil{%
\toks@={#2}%
\@tfor\next:=#3\do{%
\toks@=\expandafter{\the\expandafter\toks@\expandafter\\\next}%
}%
\begin{tabular}[#1]{@{}c@{}}\the\toks@\end{tabular}%
}
\makeatother
\begin{document}
X \verticaltext{Richard} X \verticaltext[t]{Richard} X \verticaltext[b]{Richard}
\end{document}
请注意,重音字符应该用括号括起来:
\verticaltext{H{\'e}l{\`e}ne}
但是如果您输入,XeLaTeX 就不需要这样做Hélène
。
更短的实现如下expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\verticaltext}{O{c}m}
{
\seq_set_split:Nnn \l_tmpa_seq { } { #2 }
\begin{tabular}[#1]{@{}c@{}}
\seq_use:Nn \l_tmpa_seq { \\ }
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
X \verticaltext{Richard} X \verticaltext[t]{Richard} X \verticaltext[b]{Richard}
\end{document}