Wstawianie kodu w tym dokumencie LaTeX z wcięciem


426

Jak wstawić kod do dokumentu LaTeX? Czy istnieje coś takiego:

\begin{code}## Heading ##
...
\end{code}

Jedyne, czego naprawdę potrzebuję, to wcięcie i czcionka o stałej szerokości. Podświetlanie składni może być przyjemne, chociaż zdecydowanie nie jest wymagane.


Nie jest to dokładny duplikat, ale odpowiedzi dotyczą tego samego: patrz stackoverflow.com/questions/741985/…
Charles Stewart

Mam też pytanie uzupełniające tutaj: stackoverflow.com/questions/3408996/…
sixtyfootersdude

Odpowiedzi:


630

Użyj listingspakietu.

Prosta konfiguracja nagłówka LaTeX (wcześniej \begin{document}):

\usepackage{listings}
\usepackage{color}

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\lstset{frame=tb,
  language=Java,
  aboveskip=3mm,
  belowskip=3mm,
  showstringspaces=false,
  columns=flexible,
  basicstyle={\small\ttfamily},
  numbers=none,
  numberstyle=\tiny\color{gray},
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  breaklines=true,
  breakatwhitespace=true,
  tabsize=3
}

Możesz zmienić domyślny język w środku dokumentu za pomocą \lstset{language=Java}.

Przykład użycia w dokumencie:

\begin{lstlisting}
// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;

public class Hello extends JApplet {
    public void paintComponent(Graphics g) {
        g.drawString("Hello, world!", 65, 95);
    }    
}
\end{lstlisting}

Oto wynik:

Przykładowy obraz


3
Mam pytanie uzupełniające dotyczące twojego kodu. Spójrz, jeśli masz szansę: stackoverflow.com/questions/3408996/…
sixtyfootersdude

1
Czy istnieje sposób na zmniejszenie odstępu między wierszami kodu?
sukhvir

Czy można dodać mały fragment tekstu pod fragmentem kodu, podobny do tekstu napisanego pod cyfrą w lateksie?
Brian J,

@Brian Nie jestem tego świadomy. Być może posiadanie kodu wewnątrz figuremoże osiągnąć efekt.
Cloudanger,

Słyszałem, że ten pakiet jest już nieaktualny!
xxx ---

165

Możesz także użyć pełnego środowiska

\begin{verbatim}
your
code
example
\end{verbatim}

57
Występuje problem z używaniem kart w środowisku dosłownie. Jeśli karty zostaną przekonwertowane na „spację”, problem zniknie.
midtiby

1
Jest to przydatne do wyświetlania przykładowej zawartości pliku tekstowego (np. Danych tekstowych do odczytania / przetworzenia przez program).
nalyd88

W przypadku artykułu z dwiema kolumnami marginesy nie są dobrze obsługiwane.
Sazzad Hissain Khan

115

Oto jak dodać kod wbudowany:

Możesz dodać kod wewnętrzny za pomocą {\tt code }lub \texttt{ code }. Jeśli chcesz sformatować kod wbudowany, najlepiej byłoby wykonać własne polecenie

\newcommand{\code}[1]{\texttt{#1}}

Należy również pamiętać, że bloki kodu można ładować z innych plików za pomocą

\lstinputlisting[breaklines]{source.c}

breaklinesnie jest wymagane, ale uznaję to za przydatne. Pamiętaj, że musisz podać \usepackage{ oferty } dla tego.

Aktualizacja: Pakiet list zawiera również \lstinlinepolecenie, które ma tę samą funkcję podświetlania składni, co polecenia \lstlistingi \lstinputlisting(szczegóły konfiguracji można znaleźć w odpowiedzi Cloudanger). Jak wspomniano w kilku innych odpowiedziach, istnieje również wybity pakiet, który udostępnia \mintinlinepolecenie. Podobnie \lstinline, \mintinlinezapewnia tę samą podświetlanie składni, co zwykły wybity blok kodu:

\documentclass{article}

\usepackage{minted}

\begin{document}
  This is a sentence with \mintinline{python}{def inlineCode(a="ipsum)}
\end{document}

1
czy jest lepszy sposób na wstawienie kodu, który aktywuje kolory słów kluczowych itp.?
nano

Tak. Zaktualizowałem swoją odpowiedź, aby je omówić.
alan

jak wstawiasz odstępy / tabulatory, aby wyglądały bardziej czytelnie?
Charlie Parker,

32

Specjalistyczne pakiety, takie jak minted, które bazują na Pygments do formatowania, oferują różne zalety w stosunku do listingspakietu. Aby zacytować z mintedinstrukcji,

Pygments zapewnia znacznie lepsze wyróżnianie składni w porównaniu do konwencjonalnych pakietów. Na przykład w listach zasadniczo wyróżnia się tylko ciągi, komentarze i słowa kluczowe. Pigmenty można natomiast całkowicie dostosować, aby wyróżnić dowolny token obsługiwany przez język źródłowy. Może to obejmować specjalne sekwencje formatujące wewnątrz ciągów, liczb, różnego rodzaju identyfikatorów i egzotycznych konstrukcji, takich jak znaczniki HTML.


1
Próbowałem wybić, dokumentacja jest dość prosta. Domyślny styl jest całkiem dobry.
user2262504,

5
Może to być niezadowalające rozwiązanie dla wielu użytkowników z powodu zewnętrznego połączenia wymaganego od Pygmentsic. W szczególności wymóg wywołania lateksu za pomocą -shell-escapedyrektywy jest w najlepszym razie niewielką modyfikacją istniejących systemów kompilacji, aw najgorszym przypadku niezgodny z preferencjami bezpieczeństwa niektórych użytkowników.
KDN

12

Użyj Minted .

Jest to pakiet, który ułatwia ekspresyjne podświetlanie składni w LaTeX za pomocą potężnej biblioteki Pygments . Pakiet zawiera również opcje dostosowania podświetlonego kodu źródłowego za pomocą fancyvrb .

Jest znacznie bardziej rozwinięty i konfigurowalny niż jakikolwiek inny pakiet!


Jednak, jak już wspomniano w podobnej odpowiedzi, -shell-escapemoże być do dupy dla niektórych osób.
Egor Hans,

8

Minted działa w Overleaf , TeX Live i MiKTeX.

Przykład:

\documentclass{article}
\usepackage{minted}
\begin{document}

\begin{minted}[mathescape, linenos]{python}

# Note: $\pi=\lim_{n\to\infty}\frac{P_n}{d}$
title = "Hello World"

sum = 0
for i in range(10):
 sum += i

\end{minted}

\end{document}

Wynik:

wprowadź opis zdjęcia tutaj


6

Ponieważ nie zostało to jeszcze wspomniane, warto dodać jeszcze jedną opcję, pakiet spverbatim(bez podświetlania składni):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

\begin{spverbatim}
  Your code here
\end{spverbatim}

\end{document}

Ponadto, jeśli podświetlanie składni nie jest wymagane, spakuj alltt:

\documentclass{article}
\usepackage{alltt}

\begin{document}

\begin{alltt}
  Your code here
\end{alltt}

\end{document}

1
Jest to mniej więcej to, czego chcę, ale wydaje się, że nie mogę wciskać kart. Jak wcinasz / czy istnieje podobny pakiet, który pozwala na łatwiejsze wcięcie?
Darokrithia,

1
@Darokrithia Zredagowałem moją odpowiedź: czy możesz sprawdzić / skonfrontować wcięcie? :)
MattAllegro

1
Wydaje się, że to nie działa. Mogę przesłać Ci kod, którego używam, ale formatowanie jest zniszczone w komentarzach. BTW Użyłem innej odpowiedzi i zadziałało dobrze, ale wydaje mi się, że powinno to zostać naprawione dla przyszłych czytelników.
Darokrithia

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.