正如标题所示,我正在寻找一种方法来获取环境中的第一行(可打印行)。我的第一次天真的尝试(忽略可打印要求)是这样的:
\newcommand*{\theline}{}
\newcommand*{\getline}[1]{%
\renewcommand*{\theline}{#1}%
#1%
}
\newenvironment{anewenvironment}{%
\getline%
}{}
但是,之后\theline
仅是第一个字符。例如。
\begin{anewenvironment}
Test
\end{anewenvironment}
Line: \theline
印刷:
Test
Line: T
当所需输出为:
Test
Line: Test
我想这表明我对 TeX/LaTeX 如何处理参数存在根本性的误解,因此,如果您能提供任何关于如何处理参数的想法或更广泛的说明,我将不胜感激。谢谢。
PS:我理解“行”的概念相当模糊——回想起来,“段落”可能是一个更好的术语,尽管“X 个词”也适合我的用例。
编辑:目的是找到一种方法来自动获取诗歌或文本块的引文。请参阅这个问题有关更多信息,请访问 PoetryTeX。
编辑2:看起来这些解决方案都不能很好地满足我的需要,但是,它们确实回答了我的问题,所以我标记了一个答案。
答案1
如果您想要扫描多个标记,则需要告诉 TeX。
\def\x#1{...}
将只扫描一个标记。While
\def\x#1\\{...}
将扫描直到\\
到达 a(如果不存在这样的标记,则会引发错误。)
因此,当我们扫描一个段落时,我们会 \def\x#1\par{...}
希望某一刻\par
会发生某事。
\documentclass{report}
\begin{document}
\def\getline#1\par{%
\gdef\theline{#1}#1%
}
\newenvironment{anewenvironment}{%
\getline%
}{}
\begin{anewenvironment}
Test
New par
\end{anewenvironment}
Line: \theline
\end{document}
par
扫描“第一行”。如果环境中没有,则会引发错误。
输出将是
Test new par
Line: Test
答案2
但是,如果存在嵌套环境或第一个\par
(空行)被括号隐藏,则很容易出现中断。
\documentclass{report}
\usepackage{environ}
\NewEnviron{anewenvironment}
{\expandafter\getpar\BODY\par\end\BODY}
\long\def\getpar#1\par#2\end{\gdef\theline{#1}}
\begin{document}
\begin{anewenvironment}
Testa
New par
\end{anewenvironment}
Line: \theline
\begin{anewenvironment}
Testb
\end{anewenvironment}
Line: \theline
\end{document}