Как удалить ненужные пробелы в начале строки при использовании опции linerange?

Как удалить ненужные пробелы в начале строки при использовании опции linerange?

Честно говоря, я ищу людей, которые уже 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}*

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

У меня вопрос: как удалить начальный пробел при использовании linerangeoption?

Редактировать

Рассмотрим некоторые крайние случаи ниже.

Дело 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 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}*

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