Листинг исходного кода LaTeX, как в профессиональных книгах

329

Как должен выглядеть листинг исходного кода латекса, чтобы получить результат, как в известных книгах, например, для Spring Framework? Я пробовал с пакетом латексных списков, но не смог произвести что-то, что выглядело бы так же хорошо, как показано ниже Поэтому я в первую очередь заинтересован в инструкциях по форматированию для создания чего-то вроде примера ниже (из примера главы Мэннинга для Spring in Action ):

От весны Мэннинга в действии

РЕДАКТИРОВАТЬ С помощью особенно Tormod Fjeldskår вот полный фрагмент, чтобы получить желаемый вид:

\usepackage{listings}
\usepackage{courier}
\lstset{
    basicstyle=\footnotesize\ttfamily, % Default font
    % numbers=left,              % Location of line numbers
    numberstyle=\tiny,          % Style of line numbers
    % stepnumber=2,              % Margin between line numbers
    numbersep=5pt,              % Margin between line numbers and text
    tabsize=2,                  % Size of tabs
    extendedchars=true,
    breaklines=true,            % Lines will be wrapped
    keywordstyle=\color{red},
    frame=b,
    % keywordstyle=[1]\textbf,
    % keywordstyle=[2]\textbf,
    % keywordstyle=[3]\textbf,
    % keywordstyle=[4]\textbf,   \sqrt{\sqrt{}}
    stringstyle=\color{white}\ttfamily, % Color of strings
    showspaces=false,
    showtabs=false,
    xleftmargin=17pt,
    framexleftmargin=17pt,
    framexrightmargin=5pt,
    framexbottommargin=4pt,
    % backgroundcolor=\color{lightgray},
    showstringspaces=false
}
\lstloadlanguages{ % Check documentation for further languages ...
     % [Visual]Basic,
     % Pascal,
     % C,
     % C++,
     % XML,
     % HTML,
     Java
}
% \DeclareCaptionFont{blue}{\color{blue}} 

% \captionsetup[lstlisting]{singlelinecheck=false, labelfont={blue}, textfont={blue}}
\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox[cmyk]{0.43, 0.35, 0.35,0.01}{\parbox{\textwidth}{\hspace{15pt}#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

Используйте это с этим в вашем документе:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}
Mork0075
источник
Пожалуйста, будьте точнее. Для меня список, который я разместил, «выглядит как в профессиональных книгах» и «выглядит так же хорошо», как и тот, который вы опубликовали.
Бастьен Леонар
2
Пожалуйста, используйте образец, размещенный в виде скриншота, в результате чего я хочу архивировать.
Mork0075
8
Для полноты картины вы можете добавить \ usepackage {color} к тексту, который вы разместили. Мне потребовалось мгновение, прежде чем я заметил, что это пропало.
Роберт Массайоли
1
Отличная работа! Мне пришлось добавить \ usepackage {caption} и \ usepackage {graphics}, хотя, похоже, он конвертирует одинарные кавычки.
Хакунин
Привет Морк, где я должен разместить исходный файл? В вашем примере Hello.java
RoflcoptrException

Ответы:

186

Мне кажется, что вы действительно хотите, чтобы настроить внешний вид подписи. Это проще всего сделать с помощью captionпакета. Инструкции по использованию этого пакета см. В руководстве (PDF) . Возможно, вам потребуется создать собственный формат подписи, как описано в главе 4 руководства.

Изменить: протестировано с MikTex:

\documentclass{report}

\usepackage{color}
\usepackage{xcolor}
\usepackage{listings}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
public void here() {
    goes().the().code()
}
\end{lstlisting}

\end{document}

Результат:

предварительный просмотр

Tormod Fjeldskår
источник
1
Я хотел бы переопределить формат заголовка только для вещей в разделе \ lstinputlisting (что-то вроде myCaption). У вас есть подсказка, как это сделать?
Mork0075
1
Попробуйте / captionsetup [
список рассылки
Это прекрасно работает, спасибо. У вас есть идея, как реализовать серый фон за заголовком (как в моем первом примере постов)? Не могу найти что-нибудь в документации.
Mork0075
Я думаю, что \ colorbox {grey} {\ parbox {\ textwidth} {\ textcolor {white} {текст идет сюда}}} будет где-то рядом с вашим первоначальным пост-образцом.
Tormod Fjeldskår
2
Это выглядит хорошо, но мой блок с надписями получает отступ (не текст, а сам блок). Я не знаю почему, так как в списке нет отступа.
Йохан
49

Я счастлив с listingsпакетом:

Пример листинга

Вот как я это настраиваю:

\lstset{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=tb,
columns=fullflexible,
showstringspaces=false
}

Я использую это так:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}
Бастьен Леонар
источник
1
@lamba: если я правильно помню, он говорит Latex разместить его в верхней части страницы.
Бастьен Леонар
7
Ух, списки в пропорциональном шрифте настолько безобразны. (Плюс, по культурным причинам, их трудно читать некоторым (по крайней мере, многим японцам, может быть, и другим азиатам).)
mirabilos
1
@mirabilos: да, я думаю, что изменил это позже. Это выглядело хорошо в этом списке, но не на других с большим отступом / вложением.
Бастьен Леонар
32

И, пожалуйста, что бы вы ни делали, настройте пакет листингов на использование шрифта фиксированной ширины (как в вашем примере; вы найдете этот вариант в документации). В настройках по умолчанию используется пропорциональный набор шрифтов на сетке, что, IMHO, невероятно некрасиво и нечитабельно, как видно из других ответов с картинками. Лично меня очень раздражает, когда я должен прочитать какой-то набор кода пропорциональным шрифтом.

Попробуйте установить шрифт фиксированной ширины с этим:

\lstset{basicstyle=\ttfamily}
zvrba
источник
3
Я лично использую колонки = fullfurable с basicstyle = \ small \ sffamily, как в приведенном выше примере. Символы не выровнены по вертикали, но я думаю, что они выглядят лучше, чем с \ ttfamily. Вы находите образец, который я разместил выше, безобразным?
Бастьен Леонар
Ваш конкретный пример выглядит хорошо. Тем не менее, я бы ненавидел это с помощью вложенных составных операторов, где правильный отступ (выравнивание столбцов) - большая помощь в просмотре экстента составного оператора (блока {}).
zvrba
Я думал о том же, но пока все мои списки выглядели хорошо.
Бастьен Леонар
Хорошо, вы меня убедили, я попробую ваши настройки один раз :-)
zvrba
1
Вложенные составные операторы - красная сельдь. Поскольку отступы состоят из пробелов, отступы будут выстраиваться независимо от ширины других символов.
JWG
27

Интересно, почему никто не упомянул чеканившийся пакет. У него гораздо лучшая подсветка синтаксиса, чем в листинге LaTeX. Он использует Pygments .

$ pip install Pygments

Пример в LaTeX:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{minted}

\begin{document}
\begin{minted}{python}
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #to become the incidence matrix
    VT = np.zeros((n*m,1), int)  #dummy variable

    #compute the bitwise xor matrix
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1) 

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{minted}
\end{document}

Что приводит к:

введите описание изображения здесь

Вам необходимо использовать флаг -shell-escapeс командой pdflatex.

Для получения дополнительной информации: https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Ханс Отт
источник
2
+1. Minted это пакет для набора исходного кода в LaTeX. Он не только прост в использовании, многофункциональн и хорошо документирован, но и не имеет проблем с символами Юникода в исходном коде (в отличие от listings).
ScumCoder
Боже мой! Намного лучше! Большое спасибо за предложение.
Дмитрий Зотиков
21

Попробуйте listingsпакет. Вот пример того, что я использовал некоторое время назад, чтобы иметь цветной листинг Java:

\usepackage{listings}

[...]

\lstset{language=Java,captionpos=b,tabsize=3,frame=lines,keywordstyle=\color{blue},commentstyle=\color{darkgreen},stringstyle=\color{red},numbers=left,numberstyle=\tiny,numbersep=5pt,breaklines=true,showstringspaces=false,basicstyle=\footnotesize,emph={label}}

[...]

\begin{lstlisting}
public void here() {
    goes().the().code()
}

[...]

\end{lstlisting}

Вы можете настроить это. Есть несколько ссылок на пакет объявлений. Просто погуглите их.

Markus
источник
Спасибо. Я все еще осведомлен о пакете списков, но не могу отформатировать, как мой образец. Это настоящий вопрос.
Mork0075
9

Посмотрите на algorithmsупаковку, особенно на algorithmокружающую среду.

avakar
источник
1
Спасибо. Этот пакет, кажется, очень силен в более теоретическом обсуждении алгоритма, я знаю это из многих книг по математике. Но я не буду особо подчеркивать это (предварительные условия, если, иначе), я хотел бы иметь форматирование, подобное приведенному выше.
Mork0075
4
Я говорил только об algorithmокружающей среде, а не algorithmic. algorithmэто плавающий контейнер, который выглядит довольно красиво. Вы можете положить в listingнее все, что захотите, даже упомянутые выше.
avakar
8

Вы можете сделать несколько других вещей, например, выбрать новые шрифты:

\documentclass[10pt,a4paper]{article}
% ... lots of packages e.g. babel, microtype, fontenc, inputenc &c.
\usepackage{color}    % Leave this out if you care about B/W printing, obviously.
\usepackage{upquote}  % Turns curly quotes in verbatim text into straight quotes. 
                      % People who have to copy/paste code from the PDF output 
                      % will love you for this. Or perhaps more accurately: 
                      % They will not hate you/hate you less.
\usepackage{beramono} % Or some other package that provides a fixed width font. q.v.
                      % http://www.tug.dk/FontCatalogue/typewriterfonts.html
\usepackage{listings} 
\lstset {                 % A rudimentary config that shows off some features.
    language=Java,
    basicstyle=\ttfamily, % Without beramono, we'd get cmtt, the teletype font.
    commentstyle=\textit, % cmtt doesn't do italics. It might do slanted text though.
    \keywordstyle=        % Nor does cmtt do bold text.
        \color{blue}\bfseries,
    \tabsize=4            % Or whatever you use in your editor, I suppose.
}
\begin{document} 
\begin{lstlisting}
public final int ourAnswer() { return 42; /* Our final answer */ }
\end{lstlisting} 
\end{document}
kahen
источник
2
Я считаю, что в \ keywordstyle и \ tabsize следует удалить обратную косую черту, так как это не сработает. Тем не менее, очень полезно!
Ксифиас
2

Для кода R я использую

\usepackage{listings}
\lstset{
language=R,
basicstyle=\scriptsize\ttfamily,
commentstyle=\ttfamily\color{gray},
numbers=left,
numberstyle=\ttfamily\color{gray}\footnotesize,
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
tabsize=2,
captionpos=b,
breaklines=true,
breakatwhitespace=false,
title=\lstname,
escapeinside={},
keywordstyle={},
morekeywords={}
}

И это выглядит именно так

введите описание изображения здесь

pachamaltese
источник