![自动信件和命令](https://linux22.com/image/427711/%E8%87%AA%E5%8A%A8%E4%BF%A1%E4%BB%B6%E5%92%8C%E5%91%BD%E4%BB%A4.png)
我需要自动将字母放置在我不想直接编辑的文本上。
到目前为止,我已经使用
\def\drop #1#2 {% note the space before {
\lettrine{#1}{#2} % a trailing space
}
和
\drop Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sagittis vitae massa nec gravida. Fusce quis porttitor leo.
问题是有些段落以命令开头,例如:
\marginnote{Foo} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sagittis vitae massa nec gravida. Fusce quis porttitor leo.
在这些情况下会返回各种错误;我尝试过\expandafter
但没有成功。
我怎样才能让 Latex 使用第一个“真实”的单词作为 lettrine,即忽略(最终)前面的命令?
答案1
此方法检查 后面的标记的 catcode \drop
。如果它是一个命令(catcode 0),它会执行第一个标记 blob 直到第一个空格,然后\drop
再次重新发出。因此,您不能意外地在前导宏的参数之间留下空格,例如 ,\rule{1ex} {2ex}
否则空格将阻碍参数吸收。通常,这不是问题,并且不会影响采用单个参数的命令。
\documentclass{article}
\usepackage{lettrine,marginnote}
\def\drop #1#2 {% note the space before {
\ifcat\noexpand\relax\noexpand#1\def\next{#1{#2}\drop}\else
\def\next{\lettrine{#1}{#2} }\fi% a trailing space
\next
}
\begin{document}
\drop Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sagittis vitae massa nec gravida. Fusce quis porttitor leo.
The problem is that some paragraphs start with a command, e.g:
\drop \marginnote{Foo in the margin} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sagittis vitae massa nec gravida. Fusce quis porttitor leo.
\end{document}