From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/lstaddons/lstautogobble.dtx | 329 +++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 macros/latex/contrib/lstaddons/lstautogobble.dtx (limited to 'macros/latex/contrib/lstaddons/lstautogobble.dtx') diff --git a/macros/latex/contrib/lstaddons/lstautogobble.dtx b/macros/latex/contrib/lstaddons/lstautogobble.dtx new file mode 100644 index 0000000000..f9d62cf8d3 --- /dev/null +++ b/macros/latex/contrib/lstaddons/lstautogobble.dtx @@ -0,0 +1,329 @@ +% \iffalse meta-comment +%<=*COPYRIGHT> +%% Copyright (C) 2011-2012 by Martin Scharrer +%% ----------------------------------------------------------------------- +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Martin Scharrer. +%% +%% This work consists of the files lstautogobble.dtx and lstaddons.ins +%% and the derived filebase lstautogobble.sty. +%% +%<=/COPYRIGHT> +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{lstautogobble.dtx}[% +%<=*DATE> + 2012/05/03 +%<=/DATE> +%<=*VERSION> + v0.1 +%<=/VERSION> + DTX file for 'lstautogobble'] +\documentclass{ydoc} +\GetFileInfo{lstautogobble.dtx} +\usepackage{lstautogobble}[\filedate] +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{\jobname.dtx} + \PrintChanges + \PrintIndex +\end{document} +% +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v0.1}{2012/05/03}{Initial release.} +% +% \DoNotIndex{\newcommand,\newenvironment} +% +% \GetFileInfo{lstautogobble.dtx} +% \author{Martin Scharrer} +% \email{martin@scharrer-online.de} +% \ifdefined\repository +% \repository{https://bitbucket.org/martin_scharrer/lstautogobble} +% \fi +% +% \maketitle +% +% \begin{abstract}\noindent +% This add-on package to \pkg{listings} provides a boolean \Key{autogobble} +% setting which will automatically set the \Key{gobble} setting to indention +% of the first line. +% +% This package was created as response to the question +% \href{http://tex.stackexchange.com/q/19953/2975}{``How to automatically skip leading white spaces in listings?''} +% on \href{http://tex.stackexchange.com/}{\TeX\ Stack Exchange}. +% \end{abstract} +% +% \section{Introduction} +% The \pkg{listings} package has a setting \Key{gobble}'=' which allows to remove a certain number +% of characters from the beginning of every line in the listing. This can be used to indent the listing +% in the source code without affecting the printed result. However, this forces the user to set a suitable +% value manually. An incorrect value will lead either to an indented listing or to missing leading characters. +% +% A solution for this is to automatically detect the used indention of the listing and that the \Key{gobble} setting +% to this value. This functionality is provided by this package. +% For this it reads and scans the first listing line and reinserts it again afterwards. +% +% +% \section{Usage} +% After loading \pkg{lstautogobble} the following new \pkg{listings} setting +% is available: +% +% \DescribeKey{autogobble}'=true|false' +% This boolean setting switches the autogobble feature on or off. +% If no value is used the default is `|true|'. The initial setting is `|false|'. +% One enabled the first line of any \pkg{lstlisting} is scanned and the amount +% of spaces or tabulators is used to set the \Key{gobble} setting. +% If \Key{gobble} is set manually it will not be overwritten and \Key{autogobble}'=true' +% is ignored. +% +% \section{Examples / Tests} +% The following code is intended as examples and also for testing the package. +% Here the \Key{autogobble} feature is globally enabled. +% +% \lstdefinestyle{exampleresult}{basicstyle=\ttfamily,columns=fullflexible,autogobble=true}% +% +% \begin{example} +% \caption{Only environment (with \Key{autogobble} enabled globally).} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{With options (must be skipped and reinserted).} +% \begin{examplecode} +% \begin{lstlisting}[basicstyle=\ttfamily\scriptsize] +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{Manual gobble option (override). Intentionally set to an incorrect value.} +% \begin{examplecode} +% \begin{lstlisting}[gobble=7] +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{Locally turned-off \Key{autogobble}.} +% \begin{examplecode} +% \begin{lstlisting}[autogobble=false] +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{With some material on the same line as \texttt{\string\begin} (dropped by listings. The warning message got preserved).} +% \begin{examplecode} +% \begin{lstlisting} some text at the first line +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{As before, but with optional argument.} +% \begin{examplecode} +% \begin{lstlisting}[] some text at the first line +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{Different indention levels.} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \begin{examplecode} +% \begin{lstlisting} +% test +% it +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \begin{example} +% \caption{Some real C Code.} +% \begin{examplecode} +% \begin{lstlisting}[autogobble] +% #include +% int main(){ +% printf("tex.stackexchange.com: the coolest community ever!\n"); +% } +% \end{lstlisting} +% \end{examplecode} +% \end{example} +% +% \StopEventually{} +% \clearpage +% \section{Implementation} +% +% \iffalse +%<*lstautogobble.sty> +% \fi +% \begin{macrocode} +% +\ProvidesPackage{lstautogobble}[% +% +% +%<*DRIVER> + 2099/01/01 develop +% + Implements 'autogobble' option for 'listings'] +% \end{macrocode} +% \begin{macrocode} + +% This is an add-on to the `listings` package +\RequirePackage{listings} + +% Counter for leading spaces +\newcount\lstag@spacecount + +% Some macros for comparison: +\def\lstag@activespace{\lst@ProcessSpace}% Definition of an active space +\def\lstag@tabulator{\lst@ProcessTabulator}% Definition of an tabulator + +\begingroup +\catcode`\^^M=\active% +\gdef\lstag@activenl{^^M}% Active CR (ASCII 13) character which is used as line break +\endgroup + + +% Define `autogobble` option as boolean (by default off) +\lst@Key{autogobble}{false}[t]{\lstKV@SetIf{#1}\lst@ifautogobble} + +% `ungobble` option +\lst@Key{ungobble}{0}{\def\lst@ungobble{#1}} + +% Insert required code at environment init +\lst@AddToHook{Init}{\lst@autogobble} + +% Autogobble init macro. +% If the option is active and `gobble` is not set, init vars and overwrite the process macro with own definition. +\def\lst@autogobble{% + \lst@ifautogobble + \ifnum\lst@gobble>0\else + \def\lst@gobble{\lstag@gobble}% + \def\lstag@gobble{0}% + \lstag@spacecount\z@ + \def\lstag@spaceaccu{}% + \let\lstag@restofline\empty + \let\lstag@origlstenv@Process\lstenv@Process + \let\lstenv@Process\lstag@countleadingspaces + \fi + \fi +} + +% Checks if the next following character (read as argument) is a line break (as it is supposed to be) +% Otherwise there is some text direct after the `\begin{}[]` which is dropped by `listings`. +\def\lstag@countleadingspaces#1{% + \expandafter\ifx\lstag@activenl#1\relax + \expandafter\lstag@countleadingspaces@ + \else + \def\lstag@restofline{Dummy replacement of text after begin of listing to trigger original warning message}% + \expandafter\lstag@countleadingspaces + \fi +} + +% After the new line is found this macro counts the spaces and tabulators +\def\lstag@countleadingspaces@#1{% + \ifx\lstag@activespace#1\relax + \advance\lstag@spacecount by \@ne + % Accumulate spaces (i.e. their definitions) for later re-insertion: + \expandafter\def\expandafter\lstag@spaceaccu\expandafter{\lstag@spaceaccu\lst@ProcessSpace}% + \let\next\lstag@countleadingspaces@ + \else% Character wasn't a space + \ifx\lstag@tabulator#1\relax + \advance\lstag@spacecount by \lst@tabsize\relax + % Accumulate spaces (i.e. their definitions) for later re-insertion: + \@tempcnta=\lst@tabsize\relax + \loop + \ifnum\@tempcnta>\z@ + \expandafter\def\expandafter\lstag@spaceaccu\expandafter{\lstag@spaceaccu\lst@ProcessSpace}% + \advance\@tempcnta\m@ne + \repeat + \let\next\lstag@countleadingspaces@ + \else% Character wasn't a tabulator either + % Set gobble option (indirect): + \xdef\lstag@gobble{\the\numexpr\lstag@spacecount-\lst@ungobble\relax}% + % Restore original definition of process macro: + \global\let\lstenv@Process\lstag@origlstenv@Process + % Re-insert all collected material or appropriate replacement material: + \edef\next{\noexpand\lstenv@Process\lstag@restofline\expandafter\noexpand\lstag@activenl\expandafter\unexpanded\expandafter{\lstag@spaceaccu}\noexpand#1}% + \fi\fi + \next +} +% \end{macrocode} +% \iffalse +% +% \fi +% +% \Finale +\endinput -- cgit v1.2.3