使用 \hfill 或其他方法创建具有对齐条目的码本

使用 \hfill 或其他方法创建具有对齐条目的码本

我正在尝试为我的论文创建一本代码本,但很难正确格式化它。我试图让所有变量的名称都左对齐,让变量定义也彼此左对齐。我目前已使用 \hfill 添加空格,但这并不能对齐定义,而且我的一些较长定义的长度会导致如下所示的问题。我希望所有定义文本都留在右侧,而不是在变量名称下方蜿蜒。任何建议都将不胜感激!

问题示例

答案1

您所尝试的缺少的是\parbox,因此一些喜欢{\bfseries mycodebook}\hfill\parbox[t]{8cm}{my long text}就足够了。

为了简化这一点,下面的示例显示了一个\code带有两个参数(代码和定义)的宏,该宏仅在codebook避免缩进的环境中工作,并在定义之间设置一些垂直间距。环境允许一个可选参数,该参数应该是最长的代码,以便自动调整定义的宽度。

请注意,就像在列表中一样,一旦环境结束,第一个下一段可能就不会缩进。这可能是有意义的,因为段落的开头会很清晰。但是,如果您想更改此行为,只需在环境后留一个空行即可。

\documentclass{article}
\usepackage{lipsum} % dummy text

\newlength\cbl
\newenvironment{codebook}[1][rob\_avprison1]{
\settowidth{\cbl}{#1}
%\setlength{\cbl}{#1}
\parskip1em plus .3em minus .2em
\parindent0pt
\def\code##1##2{{\bfseries ##1}\hfill%
\parbox[t]{\dimexpr\linewidth-2em-\cbl}{##2}\par}}{\noindent}

\begin{document}

\lipsum[2] 

\begin{codebook}
\code{rob\_mannim0}{\lipsum[66]}
\code{rob\_avprison1}{\lipsum[75]}
\end{codebook}
\lipsum[8] % next paragraph not indented

\begin{codebook}[book0]
\code{book0}{\lipsum[34]}
\code{book0}{\lipsum[34]}
\end{codebook}

\lipsum[6-10] % paragraph indented

\end{document}

与列表环境的主要区别在于不允许在项目内分页\code。如果您需要这样做,可以使用以下包,这是一个简单的替代方案,也可以选择调整代码空间enuitem

\documentclass{article}
\usepackage{enumitem,calc}
\usepackage{lipsum}
\newenvironment{codebook}[1][xxxxxxxxxxx]{%
\begin{description}[leftmargin=\widthof{#1}+2em, style=nextline]}
{\end{description}}
\begin{document}
\lipsum[2] 
\begin{codebook}
\item[rob\_mannim0]    \lipsum[66]
\item [rob\_avprison1] \lipsum[75]
\end{codebook}
\lipsum[4] 
\begin{codebook}[rob\_avprison1\hskip2em]
\item[rob\_mannim0]    \lipsum[66]
\item [rob\_avprison1] \lipsum[75]
\end{codebook}
\lipsum[6-10] 
\end{document}

答案2

这个解决方案要求您猜测定义所需的宽度。

\documentclass{article}
\usepackage{array}
\usepackage{longtable}
\usepackage{blindtext,showframe}% MWE only

\newcolumntype{d}{>{\textbf\bgroup}l<{\egroup}}
\setlength{\LTleft}{0pt}
\setlength{\LTright}{0pt}

\begin{document}
\begin{longtable}{@{}d@{\extracolsep{\fill}}p{3.5in}@{}}
name & \blindtext \\[\baselineskip]
another name & \blindtext
\end{longtable}

\end{document}

演示


这个解决方案更像一个列表。它还需要您猜测或计算最长名称的长度。

注意,\itemsep\labelsep是传统的,不是强制的。

\documentclass{article}
\usepackage{blindtext,showframe}% MWE only

\newlength{\maxwidth}
\settowidth{\maxwidth}{\textbf{longest name}}

\newcommand{\defineit}[1]{\ifvmode\else\vskip\itemsep\fi
  \par\leavevmode
  \hspace{-\leftskip}\makebox[\leftskip][l]{\textbf{#1}}\ignorespaces}

\newenvironment{definitions}%
 {\setlength{\parindent}{0pt}%
  \setlength{\leftskip}{\dimexpr \maxwidth+\labelsep}%
  \let\item=\defineit
  \ignorespaces
}{\par\ignorespaces}

\begin{document}
\begin{definitions}
\item{name}\blindtext
\item{longest name}\blindtext
\end{definitions}

\end{document}

相关内容