只是想调试一些东西,我想到将一个\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]}
都会失败(特别是因为前者无法处理嵌入的\par
s)。
因此,感谢回答,下面是一段代码,可以\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}