我想在使用时格式化对话文本对话包。我已经把扬声器加粗了,但无法格式化发言者的文本。我希望文本位于一个框内(无缩进)
使用以下脚本时:
\documentclass{article}
\usepackage{dialogue}
% bold the speaker name
\renewcommand*\DialogueLabel[1]{%
\scshape\textbf{#1}:\hfil
}
\begin{document}
\begin{dialogue}
\speak{Marie} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
\speak{Marine} What?
\end{dialogue}
我得到以下结果,其中段落的第二行与第一行不对齐:
我想要的是以下格式(斜体和引号是可选的):
非常感谢!
答案1
为了达到您想要的效果,我认为您需要做的是重新定义对话环境,以便将\labelwidth
设置为最长字符名称的宽度,并将设置\leftmargin
为该值加上\labelsep
(名称标签和文本之间的空间宽度)的值,我已将其设置为0.5em
。
您可以使用calc
包的\widthof{...}
命令来确定最长角色名称的长度。下面,我假设它是“Marina”,但如果您的角色名称更长,则需要\setlength{\widestname}{...
适当更改命令。
例如:
\documentclass{article}
\usepackage[T1]{fontenc} % necessary for bold small caps
\usepackage{setspace} % for double spacing
\usepackage{dialogue}
\usepackage{calc} % to measure width of widest name
\usepackage{lipsum}% dummy text
\renewcommand*\DialogueLabel[1]{%
\scshape\textbf{#1}:\hfil
}
% set width of widest name
\newlength{\widestname}
\setlength{\widestname}{%
\widthof{\textbf{\textsc{Marina}}:}
}
% redefine dialogue environment to use new parameters
\makeatletter
\renewenvironment{dialogue} {%
\begin{list}{} {%
\setlength\itemsep{\z@ \@plus .5ex}%
\setlength{\parsep}{\parskip}%
\setlength{\rightmargin}{0pt}% no indentation on right; change this if you wish
\setlength{\labelwidth}{\widestname}% set label to widest width
\setlength{\labelsep}{0.5em}% space between (longest) name and text
\setlength{\leftmargin}{\labelwidth}% set margin on left to same width
\addtolength{\leftmargin}{\labelsep}% plus the label sep
\defcommand\speak [1] {\item[{##1}]}% define speak command
\let\makelabel\DialogueLabel
}%
\PreDialogue\relax
}{%
\end{list}%
}
\makeatother
\begin{document}
\doublespacing
\lipsum[1][3-9]
\begin{dialogue}
\speak{Maria} \lipsum[2][1-2]
\speak{Marina} \lipsum[1][1-3]
\end{dialogue}
\end{document}
这给出了这个输出。
如果您还想在每个对话周围使用斜体和引号,我认为您需要使用略有不同的语法。您可以更改的定义以\speak
接受两个参数,并将第二个参数放在斜体和引号中。也就是说,更改上面的 for 行,\renewenvironment
内容dialogue
如下:
\defcommand\speak [1] {\item[{##1}]}%
变成这样:
\defcommand\speak[2]{\item[{##1}] {\itshape ``{##2}''}}%
然后你必须像这样编写对话,用括号将名字和实际对话文本括起来:
\speak{Maria}{Nam dui ligula, fingilla \ldots}
\speak{Marina}{Lorem ipsum dolor \dots}
你就会得到这个。
从风格上来说,我可能还会考虑将名称与文本右对齐:
\defcommand\speak[2]{\item[\hfill {##1}] {\itshape ``{##2}''}}%
对话包并不复杂。此时您基本上已经重写了一半;您可能考虑不用它,而是使用\enuitem
或类似的包来设置对话,但这是另一个话题。
(看起来我把“Marie”改成了“Maria”;哦,好吧,我想这对于演示解决方案并不重要。)