68

I have a document where I quiet often refer to source code element, such as class names, I wanted to format these strings differently, but at the beginning I didn't want to fiddle with various options I had, rather I defined my custom command as follows:

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

Now my question is, what do you think is the best way to define \inlinecode? Note: I often use text with unescaped <, >, e.g., List<T>.

The \texttt looks fine to me, and works with <, >, but sometimes the words overflow the line. Is there any way to tell latex not to overflow the line, but rather "underflow" or insert more spaces between words, which seems to me as (maybe still ugly but) more acceptable than overflow? And is it possible to achieve it by only changing definition of my command, so I won't have to change the whole source?

  • 4
    BTW: If you define a command like the one above you can also simply write \newcommand{\inlinecode}{\texttt} without passing the argument around. Even more efficient would be \let\inlinecode\texttt. – Martin Scharrer May 25 '11 at 9:43
58

use package listings instead. Then you can use \lstinline|<List>|. You can define the setting with \lstset{...}. A backgroundcolor is possible with a \colorbox:

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

  • 3
    \lstinline also accepts the settings as an optional argument, but for global settings \lstset{...} in the preamble is of course better. – Martin Scharrer May 25 '11 at 9:41
  • 2
    Thank you for you answer. With \lstinline the text seems as normal, it is not different from the other text, which is not in \lstinline. Is it correct behaviour? I am looking for something that will change the font, so the inline code will look different than the other text. – Steves May 25 '11 at 22:05
  • backgroundcolor is not available for \lstinline. – kiss my armpit Jul 31 '12 at 9:18
  • 1
    @GarbageCollector: you can use a color box but, of course, with no linebreak – user2478 Jan 28 '13 at 18:59
  • Herbert, I have the same question as Steves above. Could you give an example of how to make the format different from regular text? – Richard Hardy Jun 13 '17 at 9:07
25

I wouldn't use \providecommand, to begin with: if you load a package that happens to define \inlinecode, chaos might happen.

The definition is good, although I would say

\newcommand{\inlinecode}{\texttt}

that avoids reading the argument twice, but this is a minor issue. Using a self-defined command is the right way, as you can freely redefine it in (almost) any way you like.

The main problem is, of course, that long words in typewriter type are a potential source for overfull lines. There's no automatic cure, apart from enclosing the paragraph in a sloppypar environment that sets the tolerance (a measure of how much you are accepting large spaces between words) to a very high value. You can also use the \sloppy declaration that sets those parameters "forever" (but respecting groups, of course).

What to do depends on the nature of the document: an informal report might be set with \sloppy, a formal book not.

My usual suggestion is to worry about bad line breaks only when the text is in its almost final form. Only at that time you can check the bad breaks one by one: it's often easy to find a way to rephrase the paragraph and avoid the bad break. When this fails, you can put \emergencypar at the end of the paragraph, where you have defined

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

and try. You can also change the parameter by saying \emergencypar[4em] or other values. This will enlarge the interword spaces, but in a more uniform way than with \sloppy.

The command sets the \emergencystretch parameter inside a group, in which the primitive command \par (that LaTeX calls \@@par) is executed. We need to execute also \par with its present meaning, but outside the group, since this command is used by LaTeX for some internal workings.

Example (\lipsum* doesn't add \par at the end)

\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}

Some Underfull \hbox messages are unavoidable, one might insert \hbadness=4000\relax after setting the \emergencystretch in the definition above to limit their appearance only to very bad lines.

  • @Steves did you try it? How'd it go? – DanielSank Dec 29 '16 at 3:38
7

You can create your \inlinecode command which adapts to various languages.

Here is some piece of code I've been using and which was very helpful to me:

\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$}}

Then I use the command this way:

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

and what I get is this:

latex inline code

Unfortunately I could not get it to compile with comments.

EDIT: You can change the font colors in \lstset and change/remove the background by modifying or removing \colorbox

  • 1
    You have errors in your code! You define \newcommand{\inlinecode}[2]{\colorbox{lightgray}} and then place {\lstinline[language=#1]$#2$}} where the last brace is unbalanced! – clemens Oct 12 '17 at 14:12
  • @clemens Sorry for the little distraction, now it's fixed. Thank you for pointing out. – Salvioner Oct 12 '17 at 14:21
  • 1
    Doesn't work without \usepackage{color} – winklerrr Oct 29 '17 at 19:03
  • @winklerrr Answer fixed. I was working with a template which i didn't define, where the \usepackage{color} was already imported. Thanks. – Salvioner Oct 30 '17 at 12:03
  • While this works, it also fully breaks syntax highlighting in Texmaker and is therefore unusable for my purposes. – Mär Jul 2 at 13:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.