
У меня возникают проблемы при использовании lstlisting для выделения кода. В коде latex я хотел, чтобы листинг отображался под текстом, но он игнорирует структуру кода и размещает его над кодом. Как заставить листинги кода подчиняться структуре и порядку, которые я пишу в коде latex?
Основной код латекса:
\documentclass[12pt, a4paper]{article}
%% PACKAGES %%
\usepackage[a4paper,left=1.6cm, right=2cm, top=1.5cm, bottom=0.5cm,includefoot, footskip=30pt]{geometry}
\usepackage[backend=biber, style=iso-numeric, babel=other, urldate=short]{biblatex}
\addbibresource{ref.bib}
\usepackage{url}
\usepackage{float}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{caption}
\usepackage{pdfpages}
\usepackage{setspace}
\usepackage{lipsum}
%% FORMATING %%
\DeclareCaptionType{code}[code][list of code]
\renewcommand{\lstlistingname}{code}
\onehalfspacing
%% CODE COLORS %%
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.97,0.97,0.97}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegray},
keywordstyle=\color{codegreen},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2
}
\lstset{style=mystyle}
\setcounter{section}{-1}
\begin{document}
%% START DOCC %%
\section{sample that should be on top}
\lipsum[1]
\begin{center}
\begin{code}
\begin{lstlisting}[language=python, frame=single]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat
ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras \end{lstlisting}
\caption[bleh1]{bleh1}
\end{code}
\end{center}
\begin{center}
\begin{code}
\begin{lstlisting}[language=python, frame=single]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat
ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
\end{lstlisting}
\caption[bleh2]{bleh2}
\end{code}
\end{center}
%% END OF DOCC %%
\end{document}
Выход:
решение1
Добро пожаловать в TeX.SX!
Когда вы используете , \DeclareCaptionType
вы, по сути, определяете новую среду float. Ее содержимое будет, ну, плавать! Если вы не хотите, чтобы оно плавало, вы можете использовать float
спецификатор , [H]
чтобы поместить floatточногде это находится в вашем коде.Предупреждение:Есть несколько причин, по которым вам не следует этого делать (https://tex.stackexchange.com/a/373265/237192(чтобы назвать некоторых).
Другой способ — использовать placeins
' \FloatBarrier
, который не позволяет плавающим элементам пересекать этот барьер, поэтому вы можете разместить один из них после заголовка раздела.
Еще лучше: если вы не хотите, чтобы он плавал, не делайте его плавающим. Вам не нужно оборачивать его в плавающий, вы можете просто использовать \begin{lstlisting}[caption=test] ... \end{lstlisting}
. Вот как это сделать.
Еще несколько советов:
- Дальнейшее чтение:Размещение таблиц и рисунков поблизости от места их упоминания
\begin{center} ... \end{center}
добавляет нежелательное вертикальное пространство. Используйте\centering
:Следует ли использовать центрирование или выравнивание по центру для рисунков и таблиц?- Я забыл, что хотел здесь сказать. Я отредактирую, если вспомню.
Редактировать после комментария
Чтобы на самом деле иметь действительно минимальный рабочий пример:
\documentclass[12pt, a4paper]{article}
%% PACKAGES %%
\usepackage{lipsum}
\usepackage{listings}
\lstset{basicstyle=\ttfamily\footnotesize,breaklines=true,captionpos=b}
\begin{document}
\section{sample that should be on top}
\lipsum[1][1-3]
\begin{lstlisting}[language=python, frame=single, caption=This is code 1]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, ...
\end{lstlisting}
\begin{lstlisting}[language=python, frame=single, caption=This is code 2]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, ...
\end{lstlisting}
\lstlistoflistings
\end{document}