如何格式化内联源代码

如何格式化内联源代码

我有一个文档,我经常在其中引用源代码元素,例如类名,我想以不同的方式格式化这些字符串,但一开始我不想摆弄我拥有的各种选项,而是定义了我的自定义命令如下:

\providecommand{\inlinecode}[1]{\texttt{#1}}

现在我的问题是,您认为定义的最佳方法是什么\inlinecode?注意:我经常使用未转义的 <、> 的文本,例如List<T>

在我看来,这\texttt很好,并且适用于 <、>,但有时单词会溢出行。有没有办法告诉 latex 不要溢出行,而是“下溢”或在单词之间插入更多空格,这在我看来(可能仍然很丑陋,但)比溢出更容易接受?是否可以通过仅更改命令的定义来实现这一点,这样我就不必更改整个源代码了?

答案1

改用包listings。然后您可以使用\lstinline|<List>|。您可以使用定义设置\lstset{...}。可以使用背景颜色\colorbox

\colorbox{blue}{\lstinline[basicstyle=\ttfamily\color{white}]|<List>|}


答案2

\providecommand首先,我不会使用:如果你加载一个恰好定义 的包\inlinecode,可能会发生混乱。

定义很好,尽管我想说

\newcommand{\inlinecode}{\texttt}

这样就避免了两次读取参数,但这只是个小问题。使用自定义命令是正确的方法,因为您可以自由地以(几乎)任何您喜欢的方式重新定义它。

当然,主要问题是打字机字体中的长单词是导致行过满的潜在原因。除了将段落封闭在将sloppypar容差(衡量单词之间大空格的接受程度)设置为非常高的值的环境中外,没有自动解决方法。您还可以使用\sloppy将这些参数设置为“永久”的声明(但当然要尊重组)。

具体怎么做取决于文件的性质:非正式报告可能需要准备\sloppy,但正式书籍则不需要。

我通常的建议是,只有当文本接近最终形式时,才担心错误的换行符。只有那时你才能逐一检查错误的换行符:通常很容易找到一种方法来重新措辞段落并避免错误的换行符。当这种方法失败时,你可以\emergencypar在段落末尾放置你定义的

\makeatletter
\newcommand{\emergencypar}[1][3em]{%
  \begingroup\emergencystretch=#1\relax
  \@@par\aftergroup\par\endgroup}
\makeatother

并尝试。您也可以通过输入或其他值来更改参数\emergencypar[4em]。这将扩大单词间距,但比 更统一\sloppy

该命令设置\emergencystretch组内的参数,在该组中执行原始命令\par(LaTeX 调用的)。我们也需要以其当前含义执行,但在组外,因为 LaTeX 使用此命令进行一些内部工作。\@@par\par

示例(末尾\lipsum*不添加)\par

\documentclass{article}
\usepackage{lipsum}
\textwidth=5cm
\makeatletter
\newcommand{\emergencypar}[1][3em]{%
  \begingroup\emergencystretch=#1\relax
  \@@par\aftergroup\par\endgroup}
\makeatother

\begin{document}
\lipsum*[2]

\lipsum*[2]\emergencypar[2em]
\end{document}

有些Underfull \hbox消息是不可避免的,人们可以在上面的定义中\hbadness=4000\relax设置后插入\emergencystretch,以限制它们仅出现在非常糟糕的线条上。

答案3

您可以创建\inlinecode适应各种语言的命令。

下面是我一直在使用的并且对我非常有帮助的一段代码:

\usepackage{listings}
\usepackage{color}
\definecolor{lightgray}{gray}{0.9}

\lstset{
    showstringspaces=false,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue},
    commentstyle=\color[grey]{0.6},
    stringstyle=\color[RGB]{255,150,75}
}

\newcommand{\inlinecode}[2]{\colorbox{lightgray}{\lstinline[language=#1]$#2$}}

然后我这样使用该命令:

\inlinecode{Java}{import java.utils.LinkedList;}
\inlinecode{Java}{String s = "Hello, World!";}

我得到的是:

latex 内联代码

不幸的是我无法让它编译并带有注释。

编辑:您可以通过修改或删除来更改字体颜色\lstset并更改/删除背景\colorbox

答案4

解决这个问题的一个好方法是彩色盒子包,然后tcbox使用您选择的样式声明向您的序言添加自定义:

\newtcbox{\inlinecode}{on line, boxrule=0pt, boxsep=0pt, top=2pt, left=2pt, bottom=2pt, right=2pt, colback=gray!15, colframe=white, fontupper={\ttfamily \footnotesize}}

这将导致与此网站和其他网站上的内联代码类似的外观。例如:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tcolorbox}
\newtcbox{\inlinecode}{on line, boxrule=0pt, boxsep=0pt, top=2pt, left=2pt, bottom=2pt, right=2pt, colback=gray!15, colframe=white, fontupper={\ttfamily \footnotesize}}
\begin{document}
This is a sample of some inline code: \inlinecode{int x = 0;}.
\end{document}

该代码的输出如下所示:

使用 tcolorbox 制作内联代码片段的结果

相关内容