Номера строк и рисунки листинга

Номера строк и рисунки листинга

Я использую listingsдля набора текста на C внутри figureсреды рядом с диаграммой, и у меня есть числа слева. Моя проблема в том, что в two-columnрежиме номера строк появляются там, где должно быть поле, за пределами текстовой области (т. е. числа не выравниваются по левой стороне столбца, а вместо этого немного левее выравнивания). Код, который я использую, следующий:

\begin{figure*}
  \begin{minipage}{.45\textwidth}
   \begin{lstlisting}[numbers=left]
    i = 0;
    j = 1;
   \end{lstlisting}
  \end{minipage}\hfill
  \begin{minipage}{.45\textwidth}
     \includegraphics{figure}
  \end{minipage}
 \caption{My caption}
 \label{fig:blah}
\end{figure*}

Есть ли способ сохранить номера строк lstlistingвнутри текстовой области?

решение1

ThelistingsКод для записи номеров строк хранится в \lst@PlaceNumber. Под numbers=leftним определяется как:

\def\lst@PlaceNumber{\llap{\normalfont
  \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}%

который печатает число как left over lap, вызывая "проблемы", которые вы испытываете. Вы можете просто протолкнуть весь lstlistingoverпо меньшей мереуказанное выше значение (скажем, 1em+\lst@numbersep), чтобы левое перекрытие все еще оставалось в пределах границы текстового блока:

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

\documentclass[twocolumn]{article}
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{showframe}% http://ctan.org/pkg/showframe
\usepackage{listings}% http://ctan.org/pkg/listings
\begin{document}
\begin{figure*}
  \makeatletter%
  \hspace*{\dimexpr 1em+\lst@numbersep}%
  \makeatother%
\begin{minipage}{.4\textwidth}
\begin{lstlisting}[numbers=left]
i = 0;
j = 1;
\end{lstlisting}
  \end{minipage}\hfill
  \begin{minipage}{.4\textwidth}
     \includegraphics{figure}
  \end{minipage}
 \caption{My caption}
 \label{fig:blah}
\end{figure*}
\end{document}

я добавилshowframeдля выделения границы текстового блока и [demo]возможностьgraphicxдля запуска MWE. Они не нужны в вашем окончательном документе.

В качестве альтернативы вы можете установить цифры, которые будут отображаться слева.глобально(используя \lstset{numbers=left}) и затем переопределить \lst@PlaceNumberсоответствующим образом:

\makeatletter%
\def\lst@PlaceNumber{\makebox[\dimexpr 1em+\lst@numbersep][l]{\normalfont
  \lst@numberstyle{\thelstnumber}}}%
\makeatother%

Глобальная настройка необходима для того, чтобы переопределение длилось дольше \begin{lstlisting}.

решение2

Я думаю, простым решением может быть использование xleftmargin=...настройки в среде листингов. Взгляните на документацию листингов.

Связанный контент