琐事清单终极指南

琐事清单终极指南

我创建了很多theorem类似的环境,并且我通常很乐意使用一个包(例如ntheoremamsthm等)来为我完成工作。

在研究了ntheorem文档并阅读了 TeX exchange 上的许多答案之后,似乎大多数theorems,更有趣的是,很多“标准”环境(例如centertrivlist环境)是根据

我有兴趣使用trivlists 尝试我自己的环境,但想知道所有可以调整的参数 - 到目前为止我还没有找到明确的指南,因此有这个问题:)

那么,有人可以提供可以调整以便定制的所有参数的详细信息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.dtxsource2e

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}
    
  • 我不希望items 之间有任何空格,因此我使用 将它们拉到一起-\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\@itemltlists.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}

相关内容