我正在使用 XeLaTeX 和回忆录包撰写和排版一本小说。我刚刚开始使用 TeX,仍在尝试了解最佳实践。
具体来说,现在我想知道我应该如何编写具有多个缩进行文的对话。书中的示例(我希望这属于合理使用):
我应该使用段落吗?例如:
\documentclass[statementpaper]{memoir} % 8.5 x 5.5in
\begin{document}
\chapter{test}
Some flow text before the whole dialogue.
``You need a fast-burning....."
``Just as well;......"
``That did occur to me as well."\\*
Some text after the dialogue that's not indented because of the double-slash-star in the line above and the lack of an empty line.
\end{document}
这有效,但我想知道它有效是因为我做得对,还是因为碰巧类的当前样式不会破坏我的布局。由于这是一本小说,段落之间没有额外的行间距,它们只是缩进 - 所以是的,这似乎有效,但我不想养成坏习惯,以防有正确的方法来做到这一点。
(PS:我见过问题#3520,但这似乎有些不同 - 格式与我试图复制的非常不同,并且我正在使用回忆录包,据说它有很多预先设置的东西)
答案1
第一的,似乎您还不确定要如何设计对话样式,之后可能会改变主意。在这种情况下,使用 LaTeX 的“标记”功能用“语义”命令标记文本的各个部分始终是一个好主意,这样您就可以控制什么是什么。这意味着您可以创建一个自定义环境dialogue
来标记对话的开始和结束,并使用 inside 之类的命令\item
来标记每个“说话角色的变化”。结果会稍微冗长一些,但也是不言自明的,最重要的是
- 避免使用明确的硬编码布局命令(容易出错:如果忘记了怎么办
\\*
?) - 只需改变环境的定义,即可改变所有对话框的外观
第二,以统一的方式改变间距,LaTeX 为您提供了\parskip
,\parindent
以及许多其他长度,您可以修改这些长度以获得效果。您始终可以通过将代码包装在一个组中来限制对代码的修改。由于环境已将其内容包装在组中,因此您已做好一切准备。
以下是一个例子:
\documentclass[statementpaper]{memoir} % 8.5 x 5.5in
\newenvironment{dialogue}{\let\item\par}{\par\aftergroup\noindent\aftergroup\ignorespaces}
\begin{document}
\chapter{test}
Some flow text before the whole dialogue.
\begin{dialogue}
\item ``You need a fast-burning....."
\item ``Just as well;......"
\item ``That did occur to me as well."
\end{dialogue}
Some text after the dialogue that's not indented because of the double-slash-star in the line above and the lack of an empty line.
\end{document}
这个 的定义dialogue
没有多大作用,也不是很通用;重要的是主文本如何变化。现在您可以更改 的定义dialogue
以获得各种技巧:更改前后间距、中间间距、行距等等。
一个好主意是使用 LaTeXlist
的这里进行良好的讨论。一个简单的例子:
\newenvironment{dialogue}{\list{}{\itemsep=\parskip \topsep=\parskip \parsep=\parskip}}{\endlist}
现在想要在每个项目前面加一个破折号吗?
\newenvironment{dialogue}{\list{-}{\itemsep=\parskip \topsep=\parskip \parsep=\parskip}}{\endlist}
物品之间还需要一些空间吗?
\newenvironment{dialogue}{\list{}{\itemsep=\parskip \topsep=\parskip \parsep=2ex}}{\endlist}
希望全部用斜体吗?
\newenvironment{dialogue}{\list{}{\itemsep=\parskip \topsep=\parskip \parsep=\parskip \itshape}}{\endlist}
可能性是无止境!
答案2
以下是 @Bordaigorl 提供的答案的扩展,我根据自己的需要进行了调整。我调整了代码,以便当对话移动到页面中的新行时,它会从页边距的开头开始,而不是直接间隔到 下方\item
。这也允许\item
在对话函数中使用其他行:
\newenvironment{dialogue}{\list{}{\itemsep=\parskip \topsep=\parskip \parsep=\parskip \leftmargin=0em \itemindent=3em}}{\endlist}
以下是其使用示例:
\begin{dialogue}
\item `Here is a line of dialogue that may move onto the next line of text (depending on your page settings). In this instance the new line should be aligned with the edge of the margin.`
This text should also be aligned with the beginning of the margin as it is not preceded by backslash item. This may come in useful if you wish to put all text inside this function.
\end{dialogue}
可以实现相同的效果,同时保留新段落开头的缩进,如下所示:
\newenvironment{dialogue}{\list{}{\itemsep=\parskip \topsep=\parskip \parsep=\parskip \leftmargin=0em \itemindent=3em}\parindent1.5em}{\endlist}
如果您希望新行不是对话以避免段落缩进,请添加\\
如下所示:
\begin{dialogue}
\item `Here is my dialogue` \\
but I want this line at the beginning of the margin ignoring the paragraph indentation.
\end{dialogue}