如何测试一个字符串是否有多个段落,并将包含多个段落的字符串拆分为两个字符串,一个包含原始段落的第一段,一个包含剩余部分。
背景:xstring
当出现较长的(\long\def 意义上的)字符串时会失败。我正在编写一个例程,它接受引文,并在开头使用字母和用户指定数量的强调(通常是小写)文本对其进行格式化。这对于单段输入很有效,但对于多段输入会失败。在所有多段引文中,样式只需要在第一段中完成,因此需要 CAR/CDR 请求(并且可以迭代以处理包含两个以上段落的长字符串)。
我很乐意与任何感兴趣的人分享我的工作代码。
梅威瑟:
\documentclass{minimal}
\usepackage{xstring}
\begin{document}
\newcommand*{\InputOne}{abc\endgraf def}\InputOne
---
\newcommand{\InputTwo}{ghi\par jkl}\InputTwo
---
\StrLeft{\InputOne}{2}
---
\StrLeft{\InputTwo}{2}
---
\StrLeft{mno
pqr}{2}
\end{document}
答案1
我会写类似这样的东西:
\documentclass{minimal}
\makeatletter
\def\no@par{\no@par}
\long\def\remove@nopar#1\par\no@par{#1}%
\long\def\splitpar#1#2#3{%
\long\def\split@par##1\par##2\@nil{%
\def#2{##1}\def#3{##2}%
\ifx#3\no@par\let#3\@empty
\else\expandafter\def\expandafter#3\expandafter{\remove@nopar##2}%
\fi}%
\expandafter\split@par#1\par\no@par\@nil}
\makeatother
\begin{document}
\newcommand\InputOne{ghi\par jkl
mnopq}
\splitpar\InputOne\firstpar\remain
\firstpar
\hrulefill
\remain
\end{document}
答案2
\lettrine
来自的宏莱特林包与 配合得不好quotation
,因为两者都使用\parshape
。这是一个问题,因为列表环境(如 )使用了一种巧妙的机制来避免在段落末尾quotation
重置。\parshape
这就是为什么应用于\lettrine
引文开头会产生段落形状的效果。将环境内容分成两部分无法解决这个问题。
一种“解决方案”是以一种quotation
在列表或其他特殊位置无法工作的方式模拟环境,但应该与\quotation
普通文本相同。
\newenvironment{lquotation}
{\par\addvspace{\topsep}\leftskip=\leftmargini\rightskip=\leftskip
\lettrine}
{\par\addvspace{\topsep}}
(明显的)参数lquotation
将被传递给\lettrine
:
\begin{lquotation}{V}{oici}
a quotation.
With two paragraphs.
\end{lquotation}