我设置了一个\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
自动执行论证\raggedright
titlesec
没有得到实施。
答案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