如何删除 \foreach 引发的最后一个换行符

如何删除 \foreach 引发的最后一个换行符

如下例所示,有一个多余的换行符,这是不必要的。有办法消除吗?

例子:

\documentclass{article}
\usepackage{tikz}

\begin{document}
\def\mylist{str1,str2,str3}

\framebox{
  \parbox{4em}{%
    \foreach \x in \mylist {%
      \makebox[4em][s]{\x}\\%
    }%
  }
}

\end{document}

在此处输入图片描述

答案1

问题是你\\在每行末尾都发出了。你可以避免这种情况,例如使用

\documentclass{article}
\usepackage{tikz}

\begin{document}
\def\mylist{str1,str2,str3}

\framebox{
  \parbox{4em}{%
    \foreach \X [count=\Y]in \mylist {%
      \ifnum\Y=1
        \makebox[4em][s]{\X}
      \else 
        \\ \makebox[4em][s]{\X}%
      \fi
    }%
  }
}

\end{document}

在此处输入图片描述

答案2

另一种listofitems选择...

\documentclass{article}
\usepackage{listofitems}
\begin{document}
\readlist*\mylist{str1,str2,str3}
\framebox{%
  \parbox{4em}{%
    \foreachitem\x\in\mylist[]{%
      \makebox[4em][l]{\x}%
      \ifnum\xcnt<\mylistlen\relax\\\fi%
    }%
  }%
}
\end{document}

在此处输入图片描述

或者切换测试顺序:

\documentclass{article}
\usepackage{listofitems}
\begin{document}
\readlist*\mylist{str1,str2,str3}
\framebox{%
  \parbox{4em}{%
    \foreachitem\x\in\mylist[]{%
      \ifnum\xcnt=1\relax\else\\\fi%
      \makebox[4em][l]{\x}%
    }%
  }%
}
\end{document}

答案3

带有条件(最小代码文本)

\documentclass{article}
\usepackage{tikz}

\begin{document}

\def\mylist{str1,str2,str3}
\framebox{
  \parbox{4em}{%
    \foreach \x[count=\n] in \mylist {%
      \ifnum \n >1 \\ \fi
      \makebox[4em][s]{\x}%
    }%
  }
}

\end{document}

使用数组(只是为了好玩)

\documentclass{article}
\usepackage{tikz}

\begin{document}
\def\mylist{str1,str2,str3}
\def\before{{"\noexpand\\",{}}}
\framebox{
  \parbox{4em}{%
    \foreach \x[count=\n from 0] in \mylist {%
      \pgfmathparse{\before[!\n]}\pgfmathresult
      \makebox[4em][s]{\x}%
    }%
  }
}

\end{document}

沒有任何條件....

\documentclass{article}
\usepackage{tikz}

\begin{document}
\def\mylist{str2,str3}

\framebox{
  \parbox{4em}{%
   str1
    \foreach \x in \mylist {%
      \\\makebox[4em][s]{\x}%
    }%
  }
}

\end{document}

答案4

这是对一个老问题的回答,但由于所有先前的答案都使用基于计数器的条件,为了完整起见,我建议采用基于重新定义宏的解决方案。

\documentclass[varwidth, border=7pt]{standalone}
\usepackage{pgffor}

\begin{document}
  \def\mylist{str1,str2,str3}

  \framebox{
    \parbox{4em}{%
      \foreach[remember=\newline as \mynewline (initially \relax)] \x in \mylist {%
        \mynewline\makebox[4em][s]{\x}%
      }%
    }
  }
\end{document}

在此处输入图片描述

\def使用经典的&也可以获得相同的结果\gdef

\documentclass[varwidth, border=7pt]{standalone}
\usepackage{pgffor}

\begin{document}
  \def\mylist{str1,str2,str3}

  \framebox{
    \parbox{4em}{%
      \def\mynewline{}%
      \foreach \x in \mylist {%
        \mynewline\makebox[4em][s]{\x}%
        \gdef\mynewline{\newline}%
      }%
    }
  }
\end{document}

笔记:\gdef这里需要,因为创建\foreach了一个组。如果我们想避免这种情况,我们可以使用第一个解决方案或另一个循环,例如\xintFor

相关内容