如何定义跨页的双列定义环境

如何定义跨页的双列定义环境

相关问题:

我希望创建一个可以对定义进行分组以提高可读性的环境。例如:

\begin{gdefi}
\defi{Ring}{Some long description}
\defi{Homomorphism}{Some long description}
\end{gdefi}

第一个参数defi应创建一个宽度均匀的列(最长参数的宽度),其余页面宽度由第二个参数占用。我还希望此环境能够跨页面划分较长的定义组。

插图

我尝试过的实现方式:

  1. 创建两列ltablex按照建议这里,但无法编译我的文档。请参阅下文,了解使用 的非分页版本tabularx
  2. 创建一个description不使用视觉分隔列的环境。使用enumitem,我能够通过手动设置左列的固定宽度来稍微调整这一点。请参阅下面的版本,了解使用enumitem和手动指定的左列宽度。

我更喜欢方法 1,因为它似乎更容易扩展。我想到的一个扩展是创建不同的定义命令,每个命令都有自己的格式。

示例 1:不分页版本使用tabularx

\documentclass[parskip=half-, DIV=12]{scrartcl}

\usepackage{xparse}
\usepackage{tabularx}
\usepackage{lipsum}

\newcolumntype{L}{>{\raggedright\arraybackslash}X}

\newif\ifingdefi

\newcommand{\defi}[2]{%
\ifingdefi%
\textbf{#1}:~&#2\\
\else%
\begin{tabularx}{\textwidth}{@{}l@{~}L@{}}
\textbf{#1}:~&#2\\%
\end{tabularx}%
\fi
}

\DeclareDocumentEnvironment{gdefi}{o}
{%
\ingdefitrue%
\tabularx{\textwidth}{@{}l@{~}L@{}}
}
{%
\endtabularx%
\ingdefifalse%
}

\begin{document}

% This environment should break across two pages
\begin{gdefi}
\defi{Def. 1}{\lipsum[1]}
\defi{Definition 2}{\lipsum[1]}
\defi{Definition 3}{\lipsum[1]}
\defi{Definition 4}{\lipsum[1]}
\defi{Definition 5}{\lipsum[1]}
\end{gdefi}

\end{document}

示例 2:使用 的实现enumitem,仅在以下情况下有效手动指定第一列的宽度。

\documentclass[parskip=half-, DIV=12]{scrartcl}

\usepackage{xparse}
\usepackage{lipsum}

\newif\ifingdefi

\newcommand{\defi}[2]{%
\ifingdefi%
\item[#1] #2
\else%
\begin{description}
\item[#1] #2
\end{description}%
\fi
}

\DeclareDocumentEnvironment{gdefi}{o}
{%
\ingdefitrue%
\IfNoValueTF{#1}{%
\begin{description}
}{%
\begin{description}[#1]
}
}
{%
\end{description}
\ingdefifalse%
}

\usepackage{enumitem}

\begin{document}

\begin{gdefi}[leftmargin=10em,style=nextline]
  \defi{Def. 1}{\lipsum[1]}
  \defi{Definition 2}{\lipsum[1]}
  \defi{Definition 3}{\lipsum[1]}
  \defi{Definition 4}{\lipsum[1]}
  \defi{Definition 5}{\lipsum[1]}
\end{gdefi}

\end{document}

答案1

根据建议莱安德里斯,该xltabular包运行良好:

  • 自动适应左列的大小
  • 跨页分页

我的问题中方法#1的工作示例:

\documentclass[parskip=half-, DIV=12]{scrartcl}

\usepackage{xparse}
\usepackage{xltabular}
\usepackage{lipsum}

\newcolumntype{L}{>{\raggedright\arraybackslash}X}

\newif\ifingdefi

\newcommand{\defi}[2]{%
\ifingdefi%
\textbf{#1}:~&#2\\
\else%
\xltabular{\textwidth}{@{}l@{~}L@{}}
\textbf{#1}:~&#2\\%
\endxltabular
\fi
}

\DeclareDocumentEnvironment{gdefi}{o}
{%
\ingdefitrue%
\xltabular{\textwidth}{@{}l@{~}L@{}}
}
{%
\endxltabular
\ingdefifalse%
}

\begin{document}

\begin{gdefi}
\defi{Def. 1}{\lipsum[1]}
\defi{Definition 2}{\lipsum[1]}
\defi{Definition 3}{\lipsum[1]}
\defi{Definition 4}{\lipsum[1]}
\defi{Definition 5}{\lipsum[1]}
\end{gdefi}

\end{document}

相关内容