尝试使用命令将字符串转换为(表格)行,其中行的每个单元格是字符串的每个字符(的函数)。(这\tilerow
是我的尝试,\tiletext
仅用于调试)。
我猜我的问题在于&
(&符号)的保护,因为文本版本可以正常工作---它只是用 分隔字符\&
。我想对结尾的\\
(双反斜杠)做同样的事情。(我目前留下了一个.
(点)以避免出现问题。)
\documentclass[11pt]{article}
\usepackage{etoolbox,xstring,multido}
\title{Title}
\begin{document}
\newcommand{\current}{}
%%%\tiletext is just inserting \& and works
\newcommand{\tiletext}[1]
{
\renewcommand{\current}{}
\multido{\i=1+1}{5}{
\StrChar{#1}{\i}[\currentchar]
\eappto\current{\currentchar}
\ifnumless{\i}{5}{\eappto\current{ \protect\& }}{\eappto\current{ . }}
\ifnumless{\i}{5}{}{\current}
}
}
%%%%%\tilerow does not work
\newcommand{\tilerow}[1]
{
\renewcommand{\current}{}
\multido{\i=1+1}{5}{
\StrChar{#1}{\i}[\currentchar]
\eappto\current{\currentchar}
\ifnumless{\i}{5}{\eappto\current{ \protect& }}{\eappto\current{ . }}
\ifnumless{\i}{5}{}{\current}
}
}
\maketitle
%%% this works as intended (returns another string with \& seperation)
\tiletext{bt0f0}
\begin{tabular}{ccccc}
\tiletext{bt0f0} \\
\end{tabular}
%%% this doesn't work
\begin{tabular}{ccccc}
\tilerow{bt0f0}\\
\end{tabular}
\end{document}
答案1
问题是\multido
使用分组,当你传递&
TeX 时,会感到困惑,因为所有单元格都是组。请注意,它\protect&
什么都不做,因为&
它不是可扩展的标记。
这是一个 LaTeX3 的实现,其中我还添加了一个适用于每个单元格内容的函数。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\tilerow}{m}
{% pass the control to an inner function
\sunless_tilerow:n { #1 }
}
\NewDocumentEnvironment{tiled}{O{5}}
{% we have an optional argument for the number of columns
\begin{tabular}{c*{#1}{c}}
}
{
\end{tabular}
}
\cs_new:Npn \sunless_function:n #1
{% define here the action for the various cases; recall that ~ denotes a space
\str_case:nnn { #1 }
{
{a}{There~was~a}
{b}{Something~with~b}
{t}{tttttt}
{0}{ZERO!}
{1}{TRUE!}
}
{OOPS~(#1)} % all other cases
}
% two variables
\seq_new:N \l_sunless_row_seq
\tl_new:N \l_sunless_row_tl
\cs_new_protected:Npn \sunless_tilerow:n #1
{% clear the sequence where we store `\sunless_function:n {<item>}
\seq_clear:N \l_sunless_row_seq
% map the argument token by token
\tl_map_inline:nn { #1 }
{
\seq_put_right:Nn \l_sunless_row_seq
{
\sunless_function:n { ##1 }
}
}
% deliver the sequence
\seq_use:Nn \l_sunless_row_seq { & }
% finish off the row
\\
}
\ExplSyntaxOff
\begin{document}
\begin{tiled}
\tilerow{bt0f0}
\tilerow{texSE}
\tilerow{12345}
\end{tiled}
\end{document}
(感谢 Bruno Le Floch 建议简化。)
答案2
我想这就是你想要的。
我找不到你的错误来源,但我用一种稍微简单的方式重写了你的代码,之后它似乎就起作用了!我使用 TikZ\foreach
命令而不是\multido
,只是因为我更习惯那个,没有其他原因。
\documentclass[11pt]{article}
\usepackage{xstring}
\usepackage{pgffor}
\begin{document}
\newcommand{\tilerow}[1]{
\foreach\i in {1,2,...,5} {
\StrChar{#1}{\i}[\currentchar]
\ifnum\i=1
\xdef\current{\currentchar}
\else
\xdef\current{\current & \currentchar}
\fi
}
\current\\
}
\begin{tabular}{ccccc}
\tilerow{bt0f0}
\tilerow{texSE}
\tilerow{12345}
\end{tabular}