\newenvironment 文本超出文本宽度

\newenvironment 文本超出文本宽度

我设置了一个\newenvironment,这个环境中的一些文本超出了文本宽度,但这种情况并不总是发生。以下是\newenvironment设置

% is used for parameters within a detailed function description
\newenvironment{DoxyParamCaption}{%
   \renewcommand{\item}[2][]{##1 {\em ##2}}%
}{%
}

\subsubsection[{j1939\_\-initialize\_\-stack}]{\setlength{\rightskip}%
{0pt   plus 5cm}void j1939\_\-initialize\_\-stack (
\begin{DoxyParamCaption}
\item[{{\bf j1939\_\-stack\_\-id\_\-t}}]{stack\_\-id, }
\item[{{\bf ProtocolRXTablePtr}}]{rx\_\-table\_\-ptr, }
\item[{{\bf J1939TransmitMessagePtr}}]{tx\_\-table\_\-ptr, }
\item[{{\bf uint16}}]{tx\_\-table\_\-size, }
\item[{{\bf uchar8} $\ast$}]{rx\_\-buff, }
\item[{{\bf uint16}}]{rx\_\-buff\_\-size}
\end{DoxyParamCaption}
)}}

结果如下

在此处输入图片描述

如你所见,函数的头部进入了纸张的右边距。但是其他一些示例工作正常。在相同的环境中查看另一个示例,如下所示

在此处输入图片描述

我不知道为什么会发生这种情况。有人能告诉我如何解决这个问题吗?非常感谢。

答案1

尽管您明确说明了变量的连字符(通过\-),但您保留了变量类型(使用排版{\bf ...})。这是一个问题,因为 LaTeX 不知道这些“单词”在行末需要连字符的位置。从 LaTeX 尝试连字符DataWidth(如DataW\-idth您的第二个示例)中也可以看出这一点;这显然是错误的。

一种解决方案可能是\raggedright在定义中强加一种格式\subsubsection{...},使单词在末尾换行(而不是用连字符连接)\linewidth

\subsubsection[{j1939\_\-initialize\_\-stack}]{\raggedright%
  void j1939\_\-initialize\_\-stack (
  \begin{DoxyParamCaption}
    \item[{{\bf j1939\_\-stack\_\-id\_\-t}}]{stack\_\-id, }
    \item[{{\bf ProtocolRXTablePtr}}]{rx\_\-table\_\-ptr, }
    \item[{{\bf J1939TransmitMessagePtr}}]{tx\_\-table\_\-ptr, }
    \item[{{\bf uint16}}]{tx\_\-table\_\-size, }
    \item[{{\bf uchar8} $\ast$}]{rx\_\-buff, }
    \item[{{\bf uint16}}]{rx\_\-buff\_\-size}
  \end{DoxyParamCaption}
)}

然而,这实际上使得手动连字变得没有必要。无论如何,代码中也鼓励进行一些清理:

  • 根据建议l2tabu,使用{\bf ...}已过时。请改用\textbf{...}进行本地字体更改,或{\bfseries ...}进行全局字体更改。
  • 无需对 的描述符字段进行双重嵌套\item[...]。 有 就足够了\item[\textbf{uint16}]{rx\_\-buff\_\-size}
  • 编辑: 的重新定义\item不需要使用##1##2;因此将其更改为#1#2。不确定这是否可行,因为您的文档可能包含其他用途和/或重新定义,因此您保持这种方式以保持一致性。
  • 您可以包括粗体字体因变量类型重新定义而改变\item

使用上述建议,您的代码示例可以简化为

% is used for parameters within a detailed function description
\newenvironment{DoxyParamCaption}{%
   \renewcommand{\item}[2][]{\textbf{##1} {\normalfont\em ##2}}%
}{%
}

\subsubsection[j1939\_initialize\_stack]{\raggedright%
  void j1939\_initialize\_stack (
  \begin{DoxyParamCaption}
    \item[j1939\_stack\_id\_t]{stack\_id, }
    \item[ProtocolRXTablePtr]{rx\_table\_ptr, }
    \item[J1939TransmitMessagePtr]{tx\_table\_ptr, }
    \item[uint16]{tx\_table\_size, }
    \item[uchar8 $\ast$]{rx\_buff, }
    \item[uint16]{rx\_buff\_size}
  \end{DoxyParamCaption})}

这更容易阅读。由于使用范围/程度没有明确规定,因此定义一个更明确的定义,以便通过(比如说)\subsubsection自动执行论证\raggedrighttitlesec没有得到实施。

答案2

您尝试使用的用于格式化文本的 MWE 示例和方法非常复杂,并且会在您输入信息时导致很多错误。

首先,我会使用underscore包来提供下划线(消除\_)。如果单词中混杂了非字符,TeX 将不会对单词进行连字符处理,例如:

   J1939TransmitMessagePtr

没有使用连字符。

\documentclass{article}
\usepackage{underscore}
\makeatletter
 \def\pointer#1{\@tfor\next:=#1\do{\next\-}}
 \makeatother
\begin{document}
\hsize1in
\subsubsection[{j1939_initialize_stack}]{%
    stack_id, {\bf  J1939Transmit\-MessagePtr} 
 }
 % autohyphenate pointer
 \pointer{J1939TransmitMessagePtr}
\end{document}

在示例中,我\bf像您一样保留了它,以证明它不是导致错误的原因。您应该将其更改为\bfseries'

我自己的偏好是定义单独的宏,就像我对所做的那样pointer,引入可选的连字符,或者如果不想出现连字符则替换\-为,因为它有时会在计算机代码中造成混淆。hskip0pt

相关内容