将字符串转换为表格行

将字符串转换为表格行

尝试使用命令将字符串转换为(表格)行,其中行的每个单元格是字符串的每个字符(的函数)。(这\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}

在此处输入图片描述

相关内容