将长字符串拆分成段落

将长字符串拆分成段落

如何测试一个字符串是否有多个段落,并将包含多个段落的字符串拆分为两个字符串,一个包含原始段落的第一段,一个包含剩余部分。

背景: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}

相关内容