我正在尝试排版一系列诗句,其中一些诗句很长。我希望当长行溢出到下一行时缩进。这个包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}
%
}
问题在于#1
与parse 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.
}