扩展(edef)lipsum 命令?

扩展(edef)lipsum 命令?

只是想调试一些东西,我想到将一个\lipsum[1-2]语句“扩展”\edef为一个新命令(它将包含“原始”文本);奇怪的是,我无法让它工作;这个例子:

\documentclass{article}

\usepackage{lipsum}

\begin{document}

% \lipsum[1-2] % works fine

\edef\mycommand{\lipsum[1-2]}
\mycommand

\end{document}

... 崩溃原因:

! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.9 \edef\mycommand{\lipsum
                           [1-2]}

我该如何将\lipsum命令的‘内容’解包为新命令?

提前感谢任何答案,
干杯!

答案1

您不能使用\edef接受可选参数的命令;或者至少不能以这种方式使用。段落存储在名为

\lipsum@i
\lipsum@ii
\lipsum@iii

等等。你可以模仿你\edef

\makeatletter
\def\unpacklipsum#1#2#3{%
  \count@=#1\relax
  \advance\count@\m@ne
  \def#3{}%
  \loop\ifnum\count@<#2\relax
    \advance\count@\@ne
    \edef#3{#3\csname lipsum@\romannumeral\count@\endcsname}%
  \repeat}
\makeatother

然后\unpacklipsum{1}{2}{\mycommand}会做你需要做的:这将存储在\mycommand从 1 到 2 的段落中。第 42 段可以存储\mycommand

\unpacklipsum{42}{42}{\mycommand}

答案2

在这里,我只是想对这个问题发表一个补充 - 以便那些不知道这有什么用的人。你有没有试过删除一个lipsum段落?ulem\sout{\lipsum[1]}和soul\so{\lipsum[1]}都会失败(特别是因为前者无法处理嵌入的\pars)。

因此,感谢回答,下面是一段代码,可以\lipsum使用 ulem 的\sout(soul\so也有效,但措辞似乎有些牵强——如果你想看到它的效果,也可以在下面的 MWE 中直接替换它):

\documentclass{article}

\usepackage{lipsum}
\usepackage[normalem]{ulem}
\usepackage{soul}
% \usepackage{trace}

\makeatletter
\def\rempar #1\par{#1}
\def\unpacklipsum#1#2#3{%
  \count@=#1\relax
  \advance\count@\m@ne
  \def#3{}%
  \loop\ifnum\count@<#2\relax
    \advance\count@\@ne
%     \traceon
    \edef#3{#3\csname lipsum@\romannumeral\count@\endcsname}%
  \repeat}
\makeatother


\begin{document}

% unpack a lipsum paragraph
\unpacklipsum{2}{2}{\mycommand}
% remove the \par token at end (hopefully) using `\rempar`:
\edef\tmpx{\expandafter\rempar\mycommand}
% check if the actual lipsum text appears in terminal
\typeout{\meaning\tmpx}

% typeset a working "\sout{\lipsum[2]}":
\expandafter\sout\expandafter{\tmpx}

\end{document}

相关内容