防止自定义环境中的水平盒子不足

防止自定义环境中的水平盒子不足

我为一篇关于框架的论文创建了一个环境,该环境格式化了一些方法的文档。方法位于顶部,每个方法占一行,由\lstinline包设置listings

每当方法签名太长而无法容纳一行并且出现问题时,我都会收到“Underfull \hbox (badness 10000)”的提示。我搜索了一段时间,但处理该警告的建议并不适用于这种情况:

  • 没有手动换行,这会导致 \hbox 不足,它只会在自动换行时发生。

  • 添加连字符不适合程序代码,更改措辞也同样如此

以下是我的环境中的示例文档:

\documentclass{article}
\usepackage{amsmath,listings,changepage,pbox,ifthen,xparse}
\lstset{basicstyle=\ttfamily,breaklines=true}
\newcommand*{\code}[1]{\lstinline[breaklines]{#1}}

\NewDocumentEnvironment{methods}{oomooooo}{
    \smallskip
    \noindent\textit{\IfNoValueTF{#1}{Methode\IfValueTF{#4}{n:}{:\phantom{n}}}{#1}}%
    \hspace{\IfNoValueTF{#2}{1em}{#2}}%
    \pbox[t]{0.8\textwidth}{%
        \noindent\code{#3}%
        \IfValueTF{#4}{\\\code{#4}}{}%
    }%
    \begin{adjustwidth}{2.5em}{0pt}
}{
    \end{adjustwidth}
    \bigskip
}

\begin{document}

\begin{methods}{Matrix<T> submatrix()}

    This method's signature is short, it does not break and no underful hbox
    warning is issued.

\end{methods}

\begin{methods}{Matrix<T> submatrix(int startRow, int startCol, int endRow, int endCol)}

    This method's signature is long. An automatic linebreak is inserted,
    which results in underful hbox (badness 10000).

\end{methods}
\end{document}

生成的文档看起来符合我的预期,但是在相当长的原始文档中,所有不足的 hbox 警告使得很难注意到真正的问题。

是否有可能仅当在特定环境中出现 underfull hbox 警告时才抑制它们?

环境的简要说明:我希望在左侧有一个变量文本“方法”、“方法”、“构造函数”或类似内容,并在其右侧有一个左对齐的方法列表。我愿意听取有关如何以不同方式实现这一目标的建议。

答案1

我建议使用varwidth而不是\pbox;问题似乎出在 中\lstinline\raggedright里面的声明varwidth应该可以解决问题。我还会更精确地测量代码框的宽度。

\documentclass{article}
\usepackage{amsmath,listings,changepage,ifthen,xparse,lipsum,varwidth}
\usepackage[pass,showframe]{geometry}

\lstset{basicstyle=\ttfamily,breaklines=true,columns=fullflexible}
\newcommand*{\code}{\lstinline[breaklines]}

\NewDocumentEnvironment{methods}{oomooooo}
  {\smallskip
   \noindent
   \sbox0{%
     \textit{\IfNoValueTF{#1}{Methode\IfValueTF{#4}{n:}{:\phantom{n}}}{#1}}%
     \hspace{\IfNoValueTF{#2}{1em}{#2}}%
   }%
   \dimen0=\dimexpr\textwidth-\wd0\relax\box0
   \begin{varwidth}[t]{\dimen0}\raggedright
     \code{#3}\IfValueTF{#4}{\\\code{#4}}{}%
   \end{varwidth}\par
   \begin{adjustwidth}{2.5em}{0pt}
  }
  {\end{adjustwidth}\bigskip}

但我不明白你如何能做到最后的可选参数。在我看来,这不是最好的方法。

相关内容