包含解析行的新命令

包含解析行的新命令

我正在尝试排版一系列诗句,其中一些诗句很长。我希望当长行溢出到下一行时缩进。这个包parselines确实很好地满足了这一目的。

以下是示例文档:

\documentclass{article}
\usepackage[ a5paper, body={10cm,17cm}, centering ]{geometry}
\usepackage{parselines}

\setlength{\parindent}{0pt}

\begin{document}
%
\begin{minipage}[t]{.65\textwidth}
  \vspace*{0pt}
  \begin{parse lines}[\parindent 0pt]{\raggedright\hangindent1em\hangafter1 #1\par}
  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
  invidunt ut labore et dolore magna aliquyam
  erat, sed diam voluptua At vero eos et
  accusam et justo duo dolores et ea rebum.
  \end{parse lines}
\end{minipage}
\hfill
\begin{minipage}[t]{.3\textwidth}
  \vspace*{0pt}
  invidunt ut labore et dolore magna aliquyam
  erat, sed diam voluptua At vero eos et
  accusam et justo duo dolores et ea rebum.
  %
\end{minipage}
%

\end{document}

由于这必须多次完成,所以我想到定义一个相同的宏,例如:

\newcommand{\POEM}[2]{%
\begin{minipage}[t]{.65\textwidth}
  \vspace*{0pt}
  \begin{parse lines}[\parindent 0pt]{\raggedright\hangindent1em\hangafter1 #1\par}
  #1 
  \end{parse lines}
\end{minipage}
\hfill
\begin{minipage}[t]{.3\textwidth}
  \vspace*{0pt}
  #2
\end{minipage}
%
}

问题在于#1parse lines我的宏的参数冲突。我可以避免这种情况吗?

如果有其他方法/包可以实现这一点,我希望得到一些指点。

答案1

您的方法存在两个问题。不仅#1(必须将其更改为##1另一个宏内),而且\obeylines设置 (执行parse lines环境) 必须在从文件读取数据之前完成,即您不能先将数据读入参数,然后在宏中使用\obeylines(或)。\begin{parse lines}

我建议\POEM仅使用 TeX 基元和基本宏来实现宏。有三个想法

  • 排版由 完成\hbox to\hsize{\vtop{...}\hfil\vtop{...}}。这些是用来代替的原始命令\begin{minipage}\end{minipage}
  • 第一列的缩进使用负数\parindent,并且\leftskip设置原始寄存器进行补偿。
  • 设置后读取第一个参数\obeylines。参数的格式为{data},第一个参数{被忽略\let\next=,最后一个参数的}工作方式类似于\endgroup,它会关闭当前打开的\vtop。然后宏继续执行,就像\POEMB使用\aftergroup原始函数一样。
\def\POEM{\hbox to\hsize\bgroup
   \vtop\bgroup
   \hsize=.65\hsize
   \obeylines \raggedright \parindent=-1em \leftskip=1em
   \aftergroup\POEMB
   \let\next=%
}
\def\POEMB #1{\hfil 
   \vtop\bgroup
   \hsize=.3\hsize
   \parindent=0pt \emergencystretch=1em
   #1\par
   \egroup\egroup
}

\POEM {
  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
  invidunt ut labore et dolore magna aliquyam
  erat, sed diam voluptua At vero eos et
  accusam et justo duo dolores et ea rebum. 
}{
  invidunt ut labore et dolore magna aliquyam
  erat, sed diam voluptua At vero eos et
  accusam et justo duo dolores et ea rebum.
}

相关内容