在我的文档中,我有一个description
环境。描述中的一个标题太长,一行都放不下,我想把它拆开。我知道这种样式不好,但我想不出任何缩短它的方法。我试过了,\\
但\newline
没有用。我还能做什么?
我尝试使用 mdwlist 包。我在文档开头添加了以下内容:
\renewenvironment{description}{
\begin{basedescript}{%
\renewcommand{\makelabel}[1]{\bfseries##1}%
}
}{%
\desclabelstyle{\multilinelabel}
\end{basedescript}%
}
但我得到的只是相同的结果。
我也尝试过这个,但没有任何效果:
\renewenvironment{description}{
\desclabelstyle{\multilinelabel}
\begin{basedescript}{%
\renewcommand{\makelabel}[1]{\bfseries##1}%
}
}{%
\end{basedescript}%
}
我不能使用,\multilinelabel
因为标签中的单词太长,因此我想使用\pushlabel
。但是,即使在您给出的示例中,这也不起作用(可能它不知道如何换行)。有什么方法可以强制换行吗?
答案1
如果您的描述项目可能超过一行,我建议使用段落或小段落:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\newcommand*{\mtol}{This is some more text than fit at ony line but only some
and not a lot}
\begin{document}
\subparagraph{\mtol} \blindtext
\subparagraph{Or with less text} \blindtext
\subparagraph{\mtol} \blindtext
\subparagraph{\mtol} \blindtext
\end{document}
这可能会导致
这可能是您想要的,也可能不是。如果您不喜欢标签前的 par 缩进,只需将其替换\subparagraph
为\paragraph
。
或者您可以定义自己的多行描述环境,例如使用addmargin
环境KOMA-Script 包 scrextend:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{scrextend}
\newcommand*{\mtol}{This is some more text than fit at ony line but only some
and not a lot}
\newenvironment{mldescription}{%
\begin{addmargin}[2em]{1em}
\setlength{\parindent}{-1em}%
\newcommand*{\mlitem}[1]{\par\textbf{##1}\quad}\indent
}{%
\end{addmargin}
\medskip
}
\begin{document}
\blindtext
\begin{mldescription}
\mlitem{\mtol} \blindtext
\mlitem{Or with less text} \blindtext
\mlitem{\mtol} \blindtext
\mlitem{\mtol} \blindtext
\end{mldescription}
\blindtext
\end{document}
这将导致
addmargin
这几乎就是您想要的。如果您想要更多或更少的缩进或更多或更少的悬挂文本,只需更改环境或的值即可\parindent
。
如果您希望项目之间有额外的垂直空间,您也可以将其添加到新环境的定义中:
\newenvironment{mldescription}{%
\begin{addmargin}[2em]{1em}
\setlength{\parindent}{-1em}%
\newcommand*{\mlitem}[1]{\par\medskip% vertical space
\textbf{##1}\quad}\indent
}{%
\end{addmargin}
\bigskip% changed to have more vertical space than between items
}
如果您已经在使用 KOMA-Script 类,则无需加载包scrextend
。
答案2
包裹枚举项为此提供一种风格:
\documentclass{article}
\usepackage{enumitem} % load this one
\usepackage{lipsum}
\newcommand*{\longtext}{This is some text that runs off the margin
when used in a description label}
\newenvironment{longdescription}
{\begin{description}[style=unboxed]}
{\end{description}}
% Just to get dummy text
\usepackage{lipsum}
\newcommand*{\longtext}{This is some text that runs off the margin
when used in a description label}
\begin{document}
\lipsum[2]
\begin{longdescription}
\item[\longtext] \lipsum*[3]
\item[Normal label] \lipsum*[4]
\end{longdescription}
\lipsum[2]
\end{document}
答案3
在这种情况下,如果你需要多行文本,你可以使用\parbox
,例如
\documentclass{article}
\begin{document}
\begin{description}
\item[\protect{\parbox[t]{1cm}{long\\label}}] text
\end{description}
\end{document}
t
这里我使用了可选参数中的对齐参数来\parbox
获得顶行的垂直对齐。
如果想进一步定制,请查看mdwlist
包,它为描述列表标签提供了几种不同的样式,也为多行标签提供了样式。它还解决了多行标签与多行描述相结合的问题。
\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{mdwlist}
\begin{document}
\begin{basedescript}{%
\desclabelstyle{\multilinelabel}
\desclabelwidth{2cm}}
\item[This is a pretty long text for a label] \blindtext
\item[more] text
\end{basedescript}
\end{document}
答案4
如果您想采用 @Stefan Kittwitz 第一种方法使用 \parbox,您可以 \smash 它以避免换行(仅!)如果您的文本长于标签:
\documentclass{article}
\usepackage{blindtext}
\usepackage{enumitem}
\begin{document}
\setlist[description]{leftmargin=!,labelwidth=2.5cm}
\begin{description}
\item[\protect{\smash{\parbox[t]{2cm}{This is a pretty long text for a label}}}] \blindtext
\item[\protect{\smash{\parbox[t]{2cm}{This is a pretty long text for a label}}}] Lorem ipsum\\~\\~\\
\item[\protect{\smash{\parbox[t]{2cm}{This is a pretty long text for a label}}}] \blindtext
\end{description}
\end{document}
enumitem 包用于自定义描述标签。另外,很抱歉回答这个问题,我的声誉不够高,无法发表评论 :)