
Честно говоря, я ищу людей, которые уже listings
полностью прочитали документацию. Если эти люди тоже не могут решить ее, то в документации об этом ничего не сказано. Извините за неудобства.
Но, по крайней мере, я могу продемонстрировать свои усилия, предоставив вам минимальный рабочий пример.
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{Program.cs}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
// stop
}
}
\end{filecontents*}
\usepackage{accsupp}
\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}
\usepackage{xcolor}
\usepackage{listings}
\lstdefinestyle{Common}
{
language={[Sharp]C},
numbers=left,
numbersep=1em,
numberstyle=\tiny\noaccsupp,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
rulecolor=\color{red},
xleftmargin=\dimexpr\fboxsep+\fboxrule,
xrightmargin=\dimexpr\fboxsep+\fboxrule,
breaklines=true,
breakindent=0pt,
tabsize=2,
columns=flexible,
includerangemarker=false,
rangeprefix=//\ ,
}
\lstdefinestyle{A}
{
style=Common,
backgroundcolor=\color{yellow!10},
basicstyle=\scriptsize\ttfamily,
keywordstyle=\color{blue}\bf,
identifierstyle=\color{black},
stringstyle=\color{red},
commentstyle=\color{green}
}
\begin{document}
\section*{Full Code}
\lstinputlisting[style=A]{Program.cs}
\section*{Code Snippet}
\lstinputlisting[style=A,linerange=start-stop]{Program.cs}
\end{document}*
У меня вопрос: как удалить начальный пробел при использовании linerange
option?
Редактировать
Рассмотрим некоторые крайние случаи ниже.
Дело 1
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
Код должен выглядеть следующим образом:
сincludrangemarker=true
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
сincluderangemarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
Случай 2
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
Код должен выглядеть следующим образом:
с includerangemarker=true
,
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
сincluderangermarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
решение1
Вот решение. Подробности ниже.
Ограничения опции gobble
(предоставлены listings
)
Пакет listings
предоставляет ключ, называемый gobble
, который позволяет пользователю указатьзафиксированныйколичество символов (пробелов или иных), которые нужно сожрать в начале каждой строки. Однако, gobble
страдает от следующих ограничений.
- Ему не хватает автоматизации: пользователю приходится заранее просматривать список, чтобы определить, сколько мест следует занять.
- Ключ
gobble
совместим только со встроенными листингами (т.е. набранными с использованиемlstlisting
среды), что особенно важно.нетсо списками, находящимися в отдельных файлах (т. е. набранными с помощью\lstinputlisting
).
Ограничения опции autogobble
(предоставлены lstautogobble
)
Пакет lstautogobble
предоставляет логический ключ, называемый autogobble
, который автоматизирует поглощение начальных пробелов; более конкретно, он измеряет начальные пробелына самой первой строке(независимо от того, набрано оно или нет) всего листинга и передает это значение ключу gobble
. Однако autogobble
страдает от следующих ограничений.
- Поскольку он учитывает начальные пробелы в самой первой строке листинга, он может не удалить необходимое количество начальных пробелов, если диапазон набранных строк не начинается со строки 1.
- Поскольку он основан на
gobble
ключе, он наследует несовместимость последнего с\lstinputlisting
.
Новый ключ для удаления начальных пробелов:autounindent
autodedent
autounindent
Приведенный ниже подход определяет логический ключ, называемыйautounindent
autodedent
, который,
- если установлено, удаляет начальные пробелы, даже если набран только диапазон строк (т.е. если используется либо
firstline
опция , либо опция ),linerange
- являетсясовместимо с обоими
lstlisting
и\lstinputlisting
.
Известные ограничения
Приведенный ниже код пока не обрабатывает символы табуляции должным образом.
Более того, желаемое поведение вкрайние случаито, что вы смотрите в редактировании, кажется очень сложным для реализации, потому что это потребует двух проходов. Я не в своей тарелке! Лучшее, что я могу сделать, это поглотить столько пробелов, сколько есть в начале строки сразу после маркера // start
(т. е. строки, начинающейся с static void
в вашем коде).
Пожалуйста, сообщите мне о любых других проблемах.
Обновлять: Я переименовал ключ в autodedent
(что легче читать и писать, чем autounindent
). Я также исправилпроблема, о которой сообщил OP, в соответствии сэтот ответ Хайко Обердика. Наконец, для удобства я реализовал эту функцию в небольшом пакете под названием lstautodedent
; альфа-версия доступна по адресуhttps://github.com/jubobs/lstautodedent
Код
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{Program.cs}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
// stop
}
}
\end{filecontents*}
\usepackage{accsupp}
\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{lstautodedent}
\lstdefinestyle{Common}
{
language={[Sharp]C},
numbers=left,
numbersep=1em,
numberstyle=\tiny\noaccsupp,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
rulecolor=\color{red},
xleftmargin=\dimexpr\fboxsep+\fboxrule,
xrightmargin=\dimexpr\fboxsep+\fboxrule,
breaklines=true,
breakindent=0pt,
tabsize=2,
columns=flexible,
includerangemarker=false,
rangeprefix=//\ ,
}
\lstdefinestyle{A}
{
style=Common,
backgroundcolor=\color{yellow!10},
basicstyle=\scriptsize\ttfamily,
keywordstyle=\color{blue}\bf,
identifierstyle=\color{black},
stringstyle=\color{red},
commentstyle=\color{green}
}
\begin{document}
\section*{Full Code}
\lstinputlisting[style=A]{Program.cs}
\section*{Code Snippet}
\lstinputlisting[style=A,linerange=start-stop,autodedent]{Program.cs}
\end{document}*