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/sclang-prettifier/README | 9 + macros/latex/contrib/sclang-prettifier/makefile | 46 ++ .../sclang-prettifier/sclang-prettifier.dtx | 864 +++++++++++++++++++++ .../sclang-prettifier/sclang-prettifier.ins | 69 ++ .../sclang-prettifier/sclang-prettifier.pdf | Bin 0 -> 513246 bytes 5 files changed, 988 insertions(+) create mode 100644 macros/latex/contrib/sclang-prettifier/README create mode 100644 macros/latex/contrib/sclang-prettifier/makefile create mode 100644 macros/latex/contrib/sclang-prettifier/sclang-prettifier.dtx create mode 100644 macros/latex/contrib/sclang-prettifier/sclang-prettifier.ins create mode 100644 macros/latex/contrib/sclang-prettifier/sclang-prettifier.pdf (limited to 'macros/latex/contrib/sclang-prettifier') diff --git a/macros/latex/contrib/sclang-prettifier/README b/macros/latex/contrib/sclang-prettifier/README new file mode 100644 index 0000000000..3dd356fe30 --- /dev/null +++ b/macros/latex/contrib/sclang-prettifier/README @@ -0,0 +1,9 @@ +sclang-prettifier package + +Copyright 2014-- Julien Cretel + +Released under the LaTeX Project Public License 1.3 or later + +Built on top of the listings package, the sclang-prettifier package allows +you to effortlessly prettyprint SuperCollider source code in documents typeset +with LaTeX & friends. diff --git a/macros/latex/contrib/sclang-prettifier/makefile b/macros/latex/contrib/sclang-prettifier/makefile new file mode 100644 index 0000000000..0c61f04569 --- /dev/null +++ b/macros/latex/contrib/sclang-prettifier/makefile @@ -0,0 +1,46 @@ +TEXFLAGS = -e '$$pdflatex=q/pdflatex %O %S/' -pdf +LATEXMK = latexmk +RM = rm -f +PKGNAME = sclang-prettifier +PACKAGE = $(PKGNAME).dtx \ + $(PKGNAME).ins \ + $(PKGNAME).pdf \ + README \ + makefile + +all: doc + +doc: $(PKGNAME).pdf + +$(PKGNAME).pdf: $(PKGNAME).sty \ + $(PKGNAME).gls \ + $(PKGNAME).ind \ + $(PKGNAME).dtx + $(LATEXMK) $(TEXFLAGS) $(PKGNAME).dtx +# open -a Preview $(PKGNAME).pdf + +$(PKGNAME).sty: $(PKGNAME).ins \ + $(PKGNAME).dtx + latex $(PKGNAME).ins + +$(PKGNAME).gls: $(PKGNAME).glo + makeindex -s gglo.ist -o $(PKGNAME).gls $(PKGNAME).glo + +$(PKGNAME).ind: $(PKGNAME).idx + makeindex -s gind.ist -o $(PKGNAME).ind $(PKGNAME).idx + +$(PKGNAME).glo: $(PKGNAME).dtx $(PKGNAME).sty + $(LATEXMK) $(TEXFLAGS) $(PKGNAME).dtx + +dist: $(PACKAGE) + $(RM) $(PKGNAME).zip + zip $(PKGNAME).zip $(PACKAGE) + +clean: + $(RM) *.aux *.fdb_latexmk *.fls *.ind *.idx *.ilg *.glo *.gls \ + *.log *.lol *.m *.out *.tmp *.toc + +cleanall: clean + $(RM) $(PKGNAME).pdf $(PKGNAME).zip $(PKGNAME).sty + +.PHONY: all doc dist clean cleanall diff --git a/macros/latex/contrib/sclang-prettifier/sclang-prettifier.dtx b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.dtx new file mode 100644 index 0000000000..de30d6825a --- /dev/null +++ b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.dtx @@ -0,0 +1,864 @@ +% \iffalse meta-comment +% +% Copyright (C) 2014 by Julien Cretel +% +% +% 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. +% +% \fi +% +% \iffalse +%\NeedsTeXFormat{LaTeX2e}[2011/06/27] +%\ProvidesPackage{sclang-prettifier} +% [2014/06/14 v0.1 A package for prettyprinting SuperCollider +% source code] +% +%<*driver> +\documentclass[a4paper]{ltxdoc} +\EnableCrossrefs +\CodelineIndex +\RecordChanges + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{xcolor} +\usepackage{lstdoc} +\usepackage[framed,numbered]{sclang-prettifier} +\usepackage{hyperref} +\usepackage{cleveref} + +\lstset +{ + style = SuperCollider-IDE, + basicstyle = \scttfamily\small, + upquote = true, +} + +\lstdefinestyle{nonbnoframe} +{ + frame = none, + numbers = none, +} + +\newcommand*{\pkg}[1]{\textsf{#1}} +\newcommand*{\opt}[1]{\texttt{#1}} +\newcommand\SC{SuperCollider} +\newcommand\scpkg{\textsf{sclang-prettifier}} +\newcommand\lstpkg{\textsf{listings}} +\newcommand\scsty{\texttt{SuperCollider-IDE}} +\newcommand\sclng{\texttt{SuperCollider}} +\newcommand*{\sccode}[1]{% + \lstinline[style=SuperCollider-IDE,basicstyle=\scttfamily]|#1| +} +\makeindex + +\begin{document} + \DocInput{sclang-prettifier.dtx} +\end{document} +% +% \fi +% +% \CheckSum{199} +% +% \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}{2014/04/24}{Initial release.} +% +% \GetFileInfo{sclang-prettifier.sty} +% +% ^^A see http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex%2F3540 +% \begingroup +% \def\x{\#,\$,\%,\^,\_,\~,\&,\{,\},\/}%^^A +% \makeatletter +% \@onelevel@sanitize\x +% \expandafter\endgroup\expandafter\DoNotIndex\expandafter{\x} +% +% \begingroup +% \makeatletter +% \lccode`9=32\relax +% \lowercase{%^^A +% \edef\x{\noexpand\DoNotIndex{\@backslashchar9}}%^^A +% }%^^A +% \expandafter\endgroup\x +% +% \DoNotIndex{\@ifpackagewith,\@ne,\@tempa,\\} +% \DoNotIndex{\advance} +% \DoNotIndex{\begingroup,\bfseries} +% \DoNotIndex{\color,\CurrentOption} +% \DoNotIndex{\DeclareOption,\def} +% \DoNotIndex{\edef,\else,\endgroup,\expandafter} +% \DoNotIndex{\fi,\fontfamily,\framed@scpr@true} +% \DoNotIndex{\ifnum,\ifx,\iterate} +% \DoNotIndex{\let,\loop,\lst@AddToHook,\lst@Key,\lst@language,\lst@mode,^^A +% \lst@NormedDef,\lst@Pmode,\lst@SaveOutputDef,\lst@thestyle,\lst@token,^^A +% \lstdefinelanguage,\lstdefinestyle,\lsthk@DetectKeywords,\lstum@backslash} +% \DoNotIndex{\newcommand,\newcount,\newif,\newtoks,\noexpand,\normalsize,^^A +% \numbered@scpr@true} +% \DoNotIndex{\OptionNotUsed} +% \DoNotIndex{\PackageError,\PackageWarning,\PassOptionsToPackage,^^A +% \ProcessOptions} +% \DoNotIndex{\relax,\renewcommand,\repeat,\RequirePackage} +% \DoNotIndex{\selectfont} +% \DoNotIndex{\the,\ttfamily} +% \DoNotIndex{\unless} +% +% \title^^A +% {^^A +% The \scpkg{} package^^A +% \thanks^^A +% {^^A +% This document corresponds to \scpkg~\fileversion, +% dated~\filedate.^^A +% }^^A +% } +% \author{Julien Cretel\\ \texttt{jubobs.tex at gmail.com}} +% \date{\filedate} +% \thispagestyle{empty} +% \maketitle +% +% \begin{abstract} +% Built on top of the \lstpkg{} package, the \scpkg{} package allows you to +% effortlessly prettyprint \SC{} source code in documents typeset with +% \LaTeX{} \& friends. +% \end{abstract} +% +% \tableofcontents\newpage +% +% +% \part{Introduction} +% +% \section{Why this package?} +% +% \href{http://supercollider.github.io}{\SC} is a programming +% language for real-time audio synthesis and algorithmic composition. +% In February 2014, James Harkins, a \SC{} user, +% enquired on \href{http://tex.stackexchange.com}{TeX.SX} +% (\href{http://tex.stackexchange.com/q/159245/21891}{here} and +% \href{http://tex.stackexchange.com/q/159246/21891}{here}) +% about the possibility of using the \lstpkg{} package to automatically +% highlight syntactic elements of the \SC{} language such as symbols, +% environment variables, and classes, without having to list them manually as +% \lstpkg{} keywords. +% My answers to James's questions form the basis of this package. +% +% +% \section{\scpkg{} in action} +% +% The \scpkg{} package defines a \lstpkg{} style, called +% \scsty{}, that mimics the style of the \SC{} IDE. +% For an example, see \cref{SCsample}, which is adapted from this +% \href{http://tex.stackexchange.com/q/159245/21891}{TeX.SX question}. +%^^A +% \iffalse +%<*example> +% \fi +\begin{lstlisting}[ + float, + label=SCsample, + caption={Some dummy \SC{} code}, +] +p.clear; + +"Hello World!".postln; +~grains.addSpec(\tfreq, [1, 40, \exp]); +~grains.addSpec(\overlap, [0.1, 10, \exp]); +~grains.addSpec(\pos, [0, b.duration]); // 3.43 is nice! +~grains.addSpec(\rate, [0.5, 2, 'exp']); +/* + Dummy block comment. +*/ +~grains = { |tfreq = 25, overlap = 6, pan = 0, amp = 0.2, pos = 3.43, + rate = 1| + var trig = Impulse.ar(tfreq); + TGrains.ar(2, trig, b, rate, pos, overlap / tfreq, pan, amp) +}; +~grains.play; +\end{lstlisting} +% \iffalse +% +% \fi +% +% The \scpkg{} package automatically +% highlights the following syntactic elements of the \SC{} language. +% +% \paragraph{Keywords} +% \sccode{var} +% +% \paragraph{To-end-of-line and block comments} +% \sccode{// 3.43 is nice!} +% +% \paragraph{Symbols} +% \lstinline[style=SuperCollider-IDE]|\tfreq|, +% \lstinline[style=SuperCollider-IDE]|'exp'|, etc. +% +% \paragraph{Environment variables} +% \lstinline[style=SuperCollider-IDE]|~grains| +% +% \paragraph{Classes} +% \lstinline[style=SuperCollider-IDE]|Impulse|, +% \lstinline[style=SuperCollider-IDE]|TGrains|, etc. +% +% +% \part{User's guide} +% +% \section{Installation} +% +% \subsection{Package dependencies} +% +% \scpkg{} requires relatively up-to-date versions of packages \pkg{textcomp}, +% \pkg{xcolor}, and \lstpkg{}, all three of which ship with popular \TeX{} +% distributions. It loads those three packages without any options. +% +% \subsection{Installing \scpkg{}} +% +% Once the package gets officially released on +% \href{http://www.ctan.org}{CTAN}, +% you should be able to install it directly through your package manager. +% +% However, if you need to install \scpkg{} manually, you should run +%^^A +% \begin{verbatim} +% latex sclang-prettifier.ins\end{verbatim} +%^^A +% and copy the |sclang-prettifier.sty| file to a path +% where \LaTeX{} (or your preferred typesetting engine) can find it. +% To generate the documentation, run +%^^A +% \begin{verbatim} +% pdflatex sclang-prettifier.dtx +% makeindex -s gglo.ist -o sclang-prettifier.gls sclang-prettifier.glo +% makeindex -s gind.ist -o sclang-prettifier.ind sclang-prettifier.idx +% pdflatex sclang-prettifier.dtx +% pdflatex sclang-prettifier.dtx\end{verbatim} +%^^A +% +% +% \section{Getting started} +% +% As stated above, the \scpkg{} package is built on top of the \lstpkg{} +% package. +% If you already are a seasoned \lstpkg{} user, you should feel right at home. +% If you're not, be aware that this user's guide makes use of some \lstpkg{} +% functionalities (such as key-value options) without describing their usage. +% For more details on those functionalities, you should consult the +% \href{http://www.ctan.org/pkg/listings}{\lstpkg{} documentation}. +% +% +% \subsection{Loading \texorpdfstring{\scpkg{}}{sclang-prettifier}} +% +% Simply write +%^^A +% \begin{verbatim} +% \usepackage{sclang-prettifier}\end{verbatim} +%^^A +% somewhere in your preamble. +% +% You may want to load the \lstpkg{} and +% \pkg{xcolor} packages with some options; in that case, make sure those +% options are passed to those two packages \emph{before} loading the \scpkg{} +% package. +% +% The \scpkg{} package currently offers two options. +%^^A +% \begin{description} +% \item[\opt{framed}]\leavevmode +% +% Draws (by default) a dark gray frame around each listing that uses +% the \scsty{} style. +% +% \item[\opt{numbered}]\leavevmode +% +% Prints (by default) line numbers in light gray to the left of each +% listing that uses the \scsty{} style. +% +% \end{description} +% +% \subsection{Displayed listings} +% +% To typeset a \SC{} listing embedded in your |tex| file, simply enclose +% it in an |lstlisting| environment, and load the \scsty{} +% style in the environment's optional argument, +% using \lstpkg{}' \keyname{style} key. +%^^A +% \begin{verbatim} +% \begin{lstlisting}[style=SuperCollider-IDE] +% ... +% \end{lstlisting}\end{verbatim} +% +% +% \subsection{Standalone listings} +% +% In practice, though, keeping your \SC{} listings in external files^^A +% ---rather than embedding them in a |tex|~file---^^A +% is preferable, for maintainability reasons. +% To typeset a \SC{} listing residing in an |sc| (or |scx|, or |sco|) file, +% simply invoke the +% |\lstinputlisting| macro, load the \scsty{} style +% in the environment's optional argument, +% and specify the path to the file in question in the mandatory argument. +%^^A +% \begin{verbatim} +% \lstinputlisting[style=SuperCollider-IDE]{sample.sc}\end{verbatim} +%^^A +% +% +% \subsection{Inline listings} +% +% You may want to typeset fragments of \SC{} code within the main text of +% your document. For instance, you may want to typeset the +% \lstinline[style=SuperCollider-IDE]|var| keyword in a sentence, +% in order to explain its usage. +% The |\lstinline| macro can be used for typesetting such inline code. +%^^A +% \begin{verbatim} +% \lstinline[style=SuperCollider-IDE]|var|\end{verbatim} +%^^A +% Arguably, typing all this only to typeset such a simple \SC{} keyword can +% rapidly become tedious. +% Fortunately, the \lstpkg{} allows you to define a character as a shorthand +% for inline code, via the |\lstMakeShortInline| macro. +% However, this character should ideally neither be used by the language +% itself nor occur elsewhere in your document. +% Unfortunately, because the \SC{} language already uses most (all?) ASCII +% characters, your choice is limited\ldots{} +% Proceed with caution. +% For more details about inline code, +% see subsection~4.17 in the \lstpkg{} manual. +% +% +% \section{Advanced customization} +% +% \subsection{\scpkg{}'s key-value interface} +% +% The \lstpkg{} package provides a large number of options accessible via a +% nifty key-value interface, which is described in its excellent +% \href{http://www.ctan.org/pkg/listings}{documentation}. +% The \scpkg{} package extends \lstpkg{}' key-value interface interface by +% defining three additional keys that allow you to customize the styles +% applied to \SC{} symbols, environment variables, and classes, +% should you wish to do so. +% All three keys are prefixed by ``|sc|'', +% to help you distinguish them from native \lstpkg{} keys. +% +% For each of the three keys described below, +% the value assigned to it in the \scsty{} style is indicated +% on the right-hand side. +%^^A +% \begin{syntax} +% +% \item[0.1,{\color[RGB]{0,113,0}}] +% \rkeyname{scsymbolstyle}|=|\meta{style} +% +% This key determines the style applied to \SC{} symbols. +% The last token can be a one-parameter command, +% such as |\textbf| or |\underbar|. +% +% \item[0.1,{\color[RGB]{147,70,14}}] +% \rkeyname{scenvvarstyle}|=|\meta{style} +% +% This key determines the style applied to \SC{} environment variables. +% The last token can be a one-parameter command, +% such as |\textbf| or |\underbar|. +% +% \item[0.1,{\color[RGB]{0,40,211}}] +% \rkeyname{scclassstyle}|=|\meta{style} +% +% This key determines the style applied to \SC{} classes. +% The last token can be a one-parameter command, +% such as |\textbf| or |\underbar|. +% +% \end{syntax} +% +% +% \subsection{Changing the font of your \texorpdfstring{\SC}{SuperCollider} +% listings} +% +% The \scpkg{} package uses the Computer Modern typewriter font by default, +% which, arguably, is far from ideal. +% I encourage you to switch to your favourite ``programmer font'' instead. +% +% For |pdflatex| users, +% \scpkg{} conveniently provides a macro for easily selecting the Courier +% font---which is used by default by the \SC{} IDE. +%^^A +% \begin{syntax} +% +% \item[0.1] \rcmdname\scttfamily +% +% selects the Courier font. +% +% \end{syntax} +%^^A +% To use Courier in your \SC{} listings, you must pass |\scttfamily| to +% \lstpkg{}' \keyname{basicstyle} key (\emph{after} loading the +% \scsty{} style) and also---this is important---^^A +% load the \pkg{fontenc} package with option \opt{T1}: +%^^A +% \begin{verbatim} +% \usepackage[T1]{fontenc}\end{verbatim} +% +% +% \part{Miscellaneous} +% +% \section{Missing features and known issues} +% +% The \scpkg{} currently does not highlight numbers as the \SC{} IDE does. +% Highlighting numbers in \lstpkg{} in a robust manner is notoriously +% difficult; +% I might implement a solution in the future, if I ever find a good one. +% +% +% \section{Bug reports and feature suggestions} +% +% The development version of \scpkg{} is currently hosted on GitHub at +% \href{https://github.com/Jubobs/sclang-prettifier/} +% {Jubobs/sclang-prettifier}. +% If you find an issue in \scpkg{} that this manual does not mention, +% if you would like to see a feature implemented in the package, +% or if you can think of ways in which the \scpkg{} documentation could be +% improved, please add an entry to the repository's issue tracker on GitHub; +% alternatively, you can send me an email at +% \href{mailto:jubobs.tex@gmail.com}{jubobs.tex@gmail.com} +% +% \makeatletter +% \def\index@prologue{\part{Index}\markboth{Index}{Index}} +% \makeatother +% \StopEventually{^^A +% \clearpage^^A +% \PrintChanges^^A +% \setcounter{IndexColumns}{2}^^A +% \PrintIndex^^A +% } +% +% \section{Acknowledgments} +% Thanks to the developers of the \lstpkg{} package, +% without which \scpkg{} would never have existed. +% I'm also in debt to many +% \href{http://tex.stackexchange.com}{TeX.SX} users for their help, +% encouragements, and suggestions. +% Thanks in particular to +% James Harkins, whose questions inspired me to write this package, +% and to Marco Daniel, Enrico Gregorio (egreg), and Heiko Oberdiek, +% whose contributions to TeX.SX proved particularly helpful for the +% development of this package. +% +% +% \part{Implementation} +% +% Be aware that, for ``namespacing'', the \scpkg{} package uses, not a prefix, +% but the ``|scpr|''~suffix (preceded by an |@| character) throughout. +% +% +% \section{Preliminary checks} +% +% \begin{macro}{\lstoptcheck@scpr} +% Because the \lstpkg{} options \opt{noaspects}, \opt{0.21}, and +% \opt{savemem} are incompatible with \pkg{sclang-prettifier}, checking +% whether the \lstpkg{} package has been loaded with any of those options is +% a good idea; if so, we should issue an error. +% This macro checks whether \lstpkg{} was loaded with a given option +% and, if so, throws an error. +% \begin{macrocode} +\newcommand\lstoptcheck@scpr[1] +{% + \@ifpackagewith{listings}{#1}% + { + \PackageError{sclang-prettifier}% + {incompatible listings' option #1}% + {% + Make sure the `listings' package + doesn't get loaded with option `#1'% + } + } + {} +} +% \end{macrocode} +% \end{macro} +% We now use this macro to make sure that none of the problematic \lstpkg{} +% options has been passed to \lstpkg{} during an earlier loading of that +% package. +% \begin{macrocode} +\lstoptcheck@scpr{noaspects} +\lstoptcheck@scpr{0.21} +\lstoptcheck@scpr{savemem} +% \end{macrocode} +% +% +% \section{Package options} +% +% \paragraph{Framed listings} +% \begin{macro}{\ifframed@scpr@} +% This option draws (by default) a frame around each listing that uses +% the \scsty{} style. +% \begin{macrocode} +\newif\ifframed@scpr@ +\DeclareOption{framed}{\framed@scpr@true} +% \end{macrocode} +% \end{macro} +% +% \paragraph{Numbered lines} +% \begin{macro}{\ifnumbered@scpr@} +% This option prints (by default) line numbers to the left of each listing +% that uses the \scsty{} style. +% \begin{macrocode} +\newif\ifnumbered@scpr@ +\DeclareOption{numbered}{\numbered@scpr@true} +% \end{macrocode} +% \end{macro} +% +% \paragraph{Draft} +% This option is simply passed to \lstpkg{}. +% \begin{macrocode} +\DeclareOption{draft}{\PassOptionsToPackage{\CurrentOption}{listings}} +% \end{macrocode} +% +% \paragraph{Final} +% This option is simply passed to \lstpkg{}. +% \begin{macrocode} +\DeclareOption{final}{\PassOptionsToPackage{\CurrentOption}{listings}} +% \end{macrocode} +% +% \paragraph{Discard undefined options} +% We discard any other option passed to \scpkg{} by the user +% and issue a warning. +% \begin{macrocode} +\DeclareOption*% +{% + \OptionNotUsed + \PackageWarning{sclang-prettifier}{Unknown `\CurrentOption' option} +} +% \end{macrocode} +% \paragraph{Process options} +% \begin{macrocode} +\ProcessOptions\relax +% \end{macrocode} +% +% +% \section{Required packages} +% +% The \scpkg{} package require three packages without any package option: +% the \pkg{textcomp} package, in order to use \lstpkg{}' \keyname{upquote} +% key; +% the \pkg{xcolor} package, in order to color our \SC{} code; +% and, of course, the \lstpkg{} package. +% \begin{macrocode} +\RequirePackage{textcomp}[2005/09/27] +\RequirePackage{xcolor}[2007/01/21] +\RequirePackage{listings}[2013/08/26] +% \end{macrocode} +% +% +% \section{Definition of the \texorpdfstring{\sclng}{SuperCollider} language} +% +% \paragraph{Language name} +% \begin{macro}{\language@scpr} +% To avoid code duplication in this package file, we define a macro that +% expands to the name of our new language, \sclng{}. +% \begin{macrocode} +\newcommand\language@scpr{SuperCollider} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\languageNormedDefd@scpr} +% However, because \lstpkg{} ``normalizes'' language names internally, +% we also need to define a macro that expands to the normalized name of +% the new language. +% \begin{macrocode} +\expandafter\lst@NormedDef\expandafter\languageNormedDefd@scpr% + \expandafter{\language@scpr} +% \end{macrocode} +% \end{macro} +% +% \paragraph{Language definition} +% We can now define our new \lstpkg{} language, using some |\expandafter| +% trickery on |\lstdefinelanguage|. +% \begin{macrocode} +\expandafter\expandafter\expandafter\lstdefinelanguage\expandafter +{\language@scpr} +{% + morekeywords = {var}, + alsoletter = \\~, + alsoother = @, + sensitive = true, + morecomment = [l]{//}, + morecomment = [s]{/*}{*/}, + morestring = [s]{"}{"}, + moredelim = [s][\symbolStyle@scpr]{'}{'}, +}[keywords,strings,comments] +% \end{macrocode} +% +% \section{Symbols, classes and environment variables} +% +% \paragraph{Storing relevant characters} +% To detect whether an identifier is an environment variable or a symbol, +% we will need to test whether the identifier in question starts with a tilde +% or a backslash, respectively. +% \lstpkg{} developer's guide tells us that the only safe way to test +% against a character is to store it in a macro using \lstpkg{}' internal +% macro |\lst@SaveOutputDef|. +% \begin{macro}{\tilde@scpr} +% We save the tilde character thus. +% \begin{macrocode} +\lst@SaveOutputDef{`~}\tilde@scpr +% \end{macrocode} +% \end{macro} +% \begin{macro}{\dollar@scpr} +% We save the dollar-sign character thus. +% \begin{macrocode} +\lst@SaveOutputDef{`$}\dollar@scpr +% \end{macrocode} +% \end{macro} +% +% No need for such definition for the backslash: +% \lstpkg{} already stores the backslash in a macro called |\lstum@backslash|. +% +% +% \section{Using into \lstpkg{}' hooks} +% +% We apply some necessary patches in two \lstpkg{}' hooks; +% but first, we define a couple of helper macros. +% +% \paragraph{Helper macros} +% \begin{macro}{\getfirstchar@scpr} +% \begin{macro}{\getfirstchar@@scpr} +% \begin{macro}{\firstchar@scpr} +% Of these three helper macros, the first two macros extract the +% first character token in a given sequence of character tokens +% and store it in the third macro. +% This approach is adapted from this +% \href{http://tex.stackexchange.com/a/159267/21891} +% {TeX.SX answer by Marco Daniel}. +% \begin{macrocode} +\newcommand\getfirstchar@scpr{} +\newcommand\getfirstchar@@scpr{} +\newcommand\firstchar@scpr{} +\def\getfirstchar@scpr#1{\getfirstchar@@scpr#1\relax} +\def\getfirstchar@@scpr#1#2\relax{\def\firstchar@scpr{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{\hookname{Output}} +% (See the +% \href{http://www.ctan.org/pkg/listings}{\lstpkg{} documentation} +% for more details on this hook.) +% \begin{macro}{\addedToOutput@scpr} +% We add this macro (initially empty) to \lstpkg{}' +% \hookname{Output} hook. +% \begin{macrocode} +\newcommand\addedToOutput@scpr{} +\lst@AddToHook{Output}{\addedToOutput@scpr} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\currentchar@scpr} +% This count is used to test a character token against A-Z. +% \begin{macrocode} +\newcount\currentchar@scpr +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@ddedToOutput@scpr} +% The |\addedToOutput@scpr}| macro is let to this one under certain +% conditions (more details follow). +% \begin{macrocode} +\newcommand\@ddedToOutput@scpr +{% +% \end{macrocode} +% If we're in \lstpkg{}' processing mode\ldots +% \begin{macrocode} + \ifnum\lst@mode=\lst@Pmode% +% \end{macrocode} +% \ldots{} we save the first character token in the identifier being processed +% to a macro called |\firstchar@scpr|. +% \begin{macrocode} + \expandafter\getfirstchar@scpr\expandafter{\the\lst@token}% +% \end{macrocode} +% If that token is a backslash, we apply the style associated to symbols. +% \begin{macrocode} + \expandafter\ifx\firstchar@scpr\lstum@backslash% + \let\lst@thestyle\symbolStyle@scpr% +% \end{macrocode} +% If that token is a dollar sign, we have a SuperCollider ``character''. +% we apply the style associated to symbols (as in the \SC{} IDE). +% \begin{macrocode} + \else + \expandafter\ifx\firstchar@scpr\dollar@scpr% + \let\lst@thestyle\symbolStyle@scpr% +% \end{macrocode} +% If that that token is a tilde, we apply the style associated to environment +% variables. +% \begin{macrocode} + \else + \expandafter\ifx\firstchar@scpr\tilde@scpr% + \def\lst@thestyle{\envvarStyle@scpr}% +% \end{macrocode} +% Otherwise, if that character is a capital letter (A-Z), we apply the style +% associated to classes. +% \begin{macrocode} + \else + \currentchar@scpr=65 + \loop + \expandafter\ifnum% + \expandafter`\firstchar@scpr=\currentchar@scpr% + \let\lst@thestyle\classStyle@scpr% + \let\iterate\relax% + \fi + \advance\currentchar@scpr by \@ne% + \unless\ifnum\currentchar@scpr>90% + \repeat% + \fi + \fi + \fi + \fi +% \end{macrocode} +% Whatever style was applied, we still check whether the identifier is a +% keyword; if it is one, the keyword style is applied to it. +% \begin{macrocode} + \lsthk@DetectKeywords% +} +% \end{macrocode} +% \end{macro} +% +% \paragraph{\hookname{PreInit}} +% (See the +% \href{http://www.ctan.org/pkg/listings}{\lstpkg{} documentation} +% for more details on this hook.) +% Because the |\lst@AddToHook| affects hooks globally +% (i.e.\ for all listings), +% we must apply our patches only when required, i.e.\ +% in listings that use \sclng{}, and not in others. +% The \hookname{PreInit}, which is called at the very beginning of each +% listing, is where we do that. +% We check +% whether |\lst@language| and |\languageNormedDefd@scpr| expand (once) to the +% same replacement text and only apply our patches under that condition. +% \begin{macrocode} +\lst@AddToHook{PreInit} +{% + \ifx\lst@language\languageNormedDefd@scpr% + \let\addedToOutput@scpr\@ddedToOutput@scpr% + \fi +} +% \end{macrocode} +% +% +% \section{Key-value interface} +% +% We extend \lstpkg{}' key-value interface by defining several additional +% keys, which we will use to define a style similar to that of the \SC{} IDE, +% and which will allow the user to customize the style of their \SC{} +% listings. +% +% \paragraph{Symbol style} +% \begin{lstkey}{scsymbolstyle} +% \begin{macro}{\classStyle@scpr} +% This key determines the style applied to \SC{} symbols. +% \begin{macrocode} +\newcommand\symbolStyle@scpr{} +\lst@Key{scsymbolstyle}\relax% + {\def\symbolStyle@scpr{#1}} +% \end{macrocode} +% \end{macro} +% \end{lstkey} +% +% \paragraph{Environment-variable style} +% \begin{lstkey}{scenvvarstyle} +% \begin{macro}{\envvarStyle@scpr} +% This key determines the style applied to \SC{} environment variables. +% \begin{macrocode} +\newcommand\envvarStyle@scpr{} +\lst@Key{scenvvarstyle}\relax% + {\def\envvarStyle@scpr{#1}} +% \end{macrocode} +% \end{macro} +% \end{lstkey} +% +% \paragraph{Class style} +% \begin{lstkey}{scclassstyle} +% \begin{macro}{\classStyle@scpr} +% This key determines the style applied to \SC{} classes. +% \begin{macrocode} +\newcommand\classStyle@scpr{} +\lst@Key{scclassstyle}\relax% + {\def\classStyle@scpr{#1}} +% \end{macrocode} +% \end{macro} +% \end{lstkey} +% +% +% \section{User-level font macro} +% +% \begin{macro}{\scttfamily} +% This user-level macro can be used for selecting the Courier font family, +% which is used by default in the \SC{} IDE (v3.6.6, at least), and which, +% contrary to \TeX{} default font family (Computer Modern), +% comes with a boldface version. +% \begin{macrocode} +\newcommand\scttfamily{\fontfamily{pcr}\selectfont} +% \end{macrocode} +% \end{macro} +% +% +% \section{\texorpdfstring{\scsty{}}{SuperCollider-IDE} style} +% +% The \scsty{} style mimics the default style of the \SC{} IDE. +% +% \begin{macro}{\toks@scpr} +% We allocate a token list register in which we store settings that we'll use +% to define the style. +% \begin{macrocode} +\newtoks\toks@scpr +\toks@scpr=% +{ + language = \languageNormedDefd@scpr, + basicstyle = \color{black}\ttfamily\normalsize, + breaklines = true, + showspaces = false, + showstringspaces = false, + upquote = true, + rulecolor = \color{black!67}, + numberstyle = \color{black!33}, + keywordstyle = \color[RGB]{000,045,231}\bfseries, + commentstyle = \color[RGB]{202,018,000} , + stringstyle = \color[RGB]{095,095,095} , + scsymbolstyle = \color[RGB]{000,113,000} , + scenvvarstyle = \color[RGB]{147,070,014} , + scclassstyle = \color[RGB]{000,040,211} , +} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\ifframed@scpr@ + \toks@scpr\expandafter{\the\toks@scpr frame=single,} +\fi +\ifnumbered@scpr@ + \toks@scpr=\expandafter{\the\toks@scpr numbers=left,} +\fi +\begingroup\edef\@tempa{\endgroup + \noexpand\lstdefinestyle{SuperCollider-IDE}{\the\toks@scpr} +}\@tempa +% \end{macrocode} +% +% \Finale +\endinput diff --git a/macros/latex/contrib/sclang-prettifier/sclang-prettifier.ins b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.ins new file mode 100644 index 0000000000..954bc7fcb9 --- /dev/null +++ b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.ins @@ -0,0 +1,69 @@ +%% +%% Copyright (C) 2014 by Julien Cretel +%% +%% 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 file requires docstrip version 2.4 available from +% ftp.dante.de tex-archive/macros/latex/unpacked/docstrip.tex +\input docstrip +\preamble + +This is a generated file. + +Copyright (C) 2014 by Julien Cretel + +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 Julien Cretel. + +This work currently consists of the files sclang-prettifier.dtx, +sclang-prettifier.ins, and the derived file sclang-prettifier.sty. + +\endpreamble + + +\keepsilent +\askforoverwritefalse + +\usedir{tex/latex/sclang-prettifier} + +% the package +\generate +{% + \file{sclang-prettifier.sty}{\from{sclang-prettifier.dtx}{package}}% +} + +% message +\obeyspaces +\Msg{****************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the *} +\Msg{* following file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* sclang-prettifier.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file *} +\Msg{* sclang-prettifier.dtx through LaTeX. *} +\Msg{* *} +\Msg{****************************************************} + +\endbatchfile diff --git a/macros/latex/contrib/sclang-prettifier/sclang-prettifier.pdf b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.pdf new file mode 100644 index 0000000000..431186ff9c Binary files /dev/null and b/macros/latex/contrib/sclang-prettifier/sclang-prettifier.pdf differ -- cgit v1.2.3