使用 TeX/LaTeX 以编程方式生成虚拟文本

使用 TeX/LaTeX 以编程方式生成虚拟文本

为了调试另一个问题,我需要一个 TeX/LaTeX 命令来生成一些虚拟文本。我知道利普萨姆盲文,但这不是他们想要的。我想到的是接受以下参数的命令:一个字符串(s)和整数(kn),并为每行产生(无空格)k的行。我认为这应该是可能的,即使必须降级到 TeX 才能做到这一点。毕竟,TeX 是一种文本处理图灵完备的编程语言。不幸的是,我对 TeX 的了解可以放在一张邮票上,还有剩余空间,所以我在这个论坛上提问。sn

答案1

我认为最简单的方法是使用包\foreach提供的pgffor。还有较低级别的\loop\ifnum\j<\k ... \repeat循环也可以使用。但是,您需要将内循环包装在一个组中以屏蔽内循环\repeat

正如 Andrey 已经指出的那样,关于如何准确处理换行符,仍存在一个悬而未决的问题。我\\在这里只是使用了,但您可能需要其他东西,这取决于确切的应用程序。但是,循环的原理用法是相同的。

\documentclass{article}

\usepackage{pgffor}

\newcommand\dummytext[3]{%
    \foreach \n in {1,...,#3} {%
        \foreach \k in {1,...,#2} {%
            #1%
        }%
        \\
    }%
}

\begin{document}


\dummytext{HelloWorld}{5}{10}% 10 lines of 5x 'HelloWorld'

\end{document}

答案2

还有一个使用 Plain TeX 风格的解决方案\loop... \repeat

\documentclass{article}

\makeatletter
\newcommand{\dummy@line}[2]{%
  \begingroup
    \@tempcnta=#2
    \loop\ifnum\@tempcnta>0
      #1\space
      \advance\@tempcnta by -1
    \repeat
  \endgroup}
\newcommand{\dummytext}[3]{%
  \begingroup
    \@tempcnta=#3
    \par\noindent
    \loop\ifnum\@tempcnta>0
      \dummy@line{#1}{#2}\\
      \advance\@tempcnta by -1
    \repeat
    \par
  \endgroup}
\makeatother

\begin{document}

\dummytext{abc}{3}{3}

\end{document}

答案3

您已经提到了blindtext。我的第一个想法是,为什么不使用它?您只需要重新定义\blindtext@text即可获取字符串。其他值是的可选参数\Blindtext

不幸的是,缺失的空格也需要重新定义\blindtext。如果您允许空格(请参阅问题的评论),则只需删除重新定义\blindtext

下面是一个例子。

\documentclass[11pt, a4paper,english]{article}
\usepackage{babel}
\usepackage{blindtext}
\begin{document}
\makeatletter
%Define text s
\renewcommand\blindtext@text{ab}
\renewcommand\blindtext@parstart{}%since blindtext version 2.0
%remove spaces
\renewcommand{\blindtext}[1][\value{blindtext}]{%
  \blind@checklanguage
  \blind@countxx=1 %
  \loop
    \blindtext@text%    here was a \
  \ifnum\blind@countxx<#1\advance\blind@countxx by 1 %
  \repeat
}
\makeatother

%5 lines
%7repetions
\Blindtext[5][7]

\end{document}

答案4

使用 LaTeX3 时,它几乎是一行;\dummy_endline:宏确保每行后一个段落结束;当然,如果字符串的副本超过一行,它们将被换行。如果您不关心Underfull \hbox消息,请\linebreak代替\dummy_endline:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dummy}{m m m}
  {
   \prg_replicate:nn { #3 }
     {
      \prg_replicate:nn { #2 } { #1 \hfill } \dummy_endline:
     }
 }
\cs_new:Npn \dummy_endline: 
  { { \parfillskip=0pt\par } }

\ExplSyntaxOff

\begin{document}

\setlength{\parindent}{0pt}

\dummy{HelloWorld!}{5}{10}

\end{document}

相关内容