我有一个文档,我经常在其中引用源代码元素,例如类名,我想以不同的方式格式化这些字符串,但一开始我不想摆弄我拥有的各种选项,而是定义了我的自定义命令如下:
\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!";}
我得到的是:
不幸的是我无法让它编译并带有注释。
编辑:您可以通过修改或删除来更改字体颜色\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}
该代码的输出如下所示: