我创建了很多theorem
类似的环境,并且我通常很乐意使用一个包(例如ntheorem
、amsthm
等)来为我完成工作。
在研究了ntheorem
文档并阅读了 TeX exchange 上的许多答案之后,似乎大多数theorems
,更有趣的是,很多“标准”环境(例如center
trivlist
环境)是根据
我有兴趣使用trivlist
s 尝试我自己的环境,但想知道所有可以调整的参数 - 到目前为止我还没有找到明确的指南,因此有这个问题:)
那么,有人可以提供可以调整以便定制的所有参数的详细信息trivlist
吗?
这是一个可以玩的 MWE
\documentclass{article}
\usepackage[showframe=true]{geometry}
\usepackage{lipsum}
\setlength{\parskip}{5mm}
\newenvironment{problem}{%
\begin{trivlist}%
\item[{\bfseries Problem}]%
\item%
}{\end{trivlist}}
\begin{document}
\begin{problem}
\lipsum[1]
\end{problem}
\end{document}
有趣的是,没有trivlist
标签,因此请随意重新标记您认为合适的内容。
答案1
我不能说这个答案是一个明确的指南,但可以做出的明确陈述trivlists
是,它们是纯香草 列表。
\begin{trivlist}
\item $\varepsilon$-\TeX
\item[test] a line to test
\item Ghostscript, version $\ge8.31$
\item dvipdfmx, version $\ge20080607$ for DVI to PDF conversion
\item Adobe Reader or another viewer
\end{trivlist}
简单来说,trivlist
环境将每个项目变成一个段落,因此,如果你想以这种方式思考,将格式信息应用于段落或项目的列表会更容易。由于它为所有列表提供通用信息,因此它用于构建更复杂的结构。所有 LaTeX 的列表都用于parshape
塑造段落,并且来源不容易理解。
当然,明确的指南是File A: ltlists.dtx
在source2e
。
trivlists 的一个很好的用途是简化表头的编写并产生语义表环境:
\documentclass{article}
\begin{document}
\newenvironment{name}
{\trivlist\item
\tabular{@{}ll@{}}}
{\endtabular\endtrivlist}
\begin{name}
First & Mary \\
Second & Jones \\
Nickname & --- \\
\end{name}
\end{document}
答案2
Yiannis 提供了有关在哪里可以找到权威指南的详细信息:
texdoc source2e
第 56 节非常详细,提供了所有可以调整的参数。我想提供一个供将来参考的小例子——也许它会帮助其他人创建环境。(我并不认为这个答案是权威指南,而只是一个可能对其他人有帮助的入门实验。)
动机
lists
首先,我对和感兴趣的原因trivlists
是为了创建theorem
类似环境。特别是,我想模仿包break
中的风格ntheorem
,它会产生类似
最初我认为 atrivlist
是合适的,但引用@egreg 的评论这个答案
只要此 trivlist 中没有出现基于列表的环境,此方法即可起作用。
\begin{list}{}{\leftmargin=2cm}...\end{list}
不会出现此问题(这是所采用的方法adjustwidth
)。
因此,我决定使用list
环境而不是trivlist
,并研究了changepage
文档。
环境list
环境list
具有以下形式
\begin{list}{<label>}{options}
\item ...
\end{list}
完整的选项集在 中有详细介绍source2e
,但这里我只会介绍其中的几个。对于我的特定应用程序,我不需要<label>
,因此此参数将始终为空。
列表环境的默认设置(没有任何选项)
\begin{list}{}{} \item {\bfseries Problem} \item \lipsum[1] \end{list}
给出以下输出
请注意,列表是缩进的,并且问题而下一个
item
并不理想我们可以调整一些选项
\begin{list}{}{% options \setlength{\leftmargin}{0mm}% leftmargin \parsep\parskip% space between paragraphs within an item \setlength{\itemsep}{-\parsep}% space between items } \item {\bfseries Problem} \item \lipsum[1] \end{list}
我不希望
item
s 之间有任何空格,因此我使用 将它们拉到一起-\parsep
,这样就得到了所需的结果
当然,这一切都可以在序言中完成,以便\newenvironment
\newenvironment{problem}{\begin{list}{}{%
\setlength{\leftmargin}{0mm}%
\setlength{\rightmargin}{0mm}%
\setlength{\topsep}{0mm}%
\setlength{\partopsep}{0mm}%
\parsep\parskip%
\setlength{\itemsep}{-\parsep}%
}\needspace{\baselineskip}\item {\bfseries Problem}
\item}{\end{list}}
我使用了needspace
提供命令\needspace{<space>}
来停止在问题以及环境主体。
编辑
感谢 Philippe Goutet 指出这种needspace
方法实际上存在很大缺陷;特别是,如果环境problem
紧随 的出现,那么它可能会隐藏节标题并开始一个新页面 - 非常糟糕!因此,他建议我将和\section{}
的定义(从)复制到一些名为 和 的新命令中,并将 更改为。\item
\@item
ltlists.dtx
\nobreakitem
\@nobreakitem
\addpenalty\@itempenalty
\addpenalty\@M
接下来是一个完整的 MWE,它实际证明了这一点,特别是证明了我们没有得到任何孤独的孤立的部分标题 - 呼啦!
\documentclass{article}
\usepackage[showframe=true]{geometry}
\usepackage{lipsum}
\makeatletter
% copied from ltlists.dtx
\def\nobreakitem{%
\@inmatherr\nobreakitem
\@ifnextchar [\@nobreakitem{\@noitemargtrue \@nobreakitem[\@itemlabel]}}
\def\@nobreakitem[#1]{%
\if@noparitem
\@donoparitem
\else
\if@inlabel
\indent \par
\fi
\ifhmode
\unskip\unskip \par
\fi
\if@newlist
\if@nobreak
\@nbitem
\else
\addpenalty\@beginparpenalty
\addvspace\@topsep
\addvspace{-\parskip}%
\fi
\else
\addpenalty\@M%only new bit!
\addvspace\itemsep
\fi
\global\@inlabeltrue
\fi
\everypar{%
\@minipagefalse
\global\@newlistfalse
\if@inlabel
\global\@inlabelfalse
{\setbox\z@\lastbox
\ifvoid\z@
\kern-\itemindent
\fi}%
\box\@labels
\penalty\z@
\fi
\if@nobreak
\@nobreakfalse
\clubpenalty \@M
\else
\clubpenalty \@clubpenalty
\everypar{}%
\fi}%
\if@noitemarg
\@noitemargfalse
\if@nmbrlist
\refstepcounter\@listctr
\fi
\fi
\sbox\@tempboxa{\makelabel{#1}}%
\global\setbox\@labels\hbox{%
\unhbox\@labels
\hskip \itemindent
\hskip -\labelwidth
\hskip -\labelsep
\ifdim \wd\@tempboxa >\labelwidth
\box\@tempboxa
\else
\hbox to\labelwidth {\unhbox\@tempboxa}%
\fi
\hskip \labelsep}%
\ignorespaces}
\makeatother
\newenvironment{problem}{\begin{list}{}{%
\parsep\parskip%
\setlength{\itemsep}{-\parsep}%
}\item {\bfseries Problem}
\nobreakitem}{\end{list}}
\begin{document}
\lipsum[1]
\vspace{13.55cm} % just to simulate potential page breaks
\section{no page breaks here!}
\begin{problem}
\lipsum[1]
\lipsum[1]
\end{problem}
\end{document}