diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/lstfiracode |
Initial commit
Diffstat (limited to 'macros/latex/contrib/lstfiracode')
-rw-r--r-- | macros/latex/contrib/lstfiracode/README.md | 51 | ||||
-rw-r--r-- | macros/latex/contrib/lstfiracode/lstfiracode.pdf | bin | 0 -> 54036 bytes | |||
-rw-r--r-- | macros/latex/contrib/lstfiracode/lstfiracode.sty | 220 | ||||
-rw-r--r-- | macros/latex/contrib/lstfiracode/lstfiracode.tex | 332 |
4 files changed, 603 insertions, 0 deletions
diff --git a/macros/latex/contrib/lstfiracode/README.md b/macros/latex/contrib/lstfiracode/README.md new file mode 100644 index 0000000000..f83f6f31ee --- /dev/null +++ b/macros/latex/contrib/lstfiracode/README.md @@ -0,0 +1,51 @@ +lstfiracode +=========== + +The `lstfiracode` package defines `FiraCodeStyle`, to be used as +`\lstset{style=FiraCodeStyle}` with the [`listings`](https://ctan.org/pkg/listings) +package. This style contains almost all ligatures in Nikita Prokopov’s +[Fira Code](https://github.com/tonsky/FiraCode) family of fonts. +A new key `moreliterate` to `\lstset` is added, allowing additional user ligatures. +Additional support for source code listings using Fira Code +in the `verbatim` environment is available. + +This package does NOT provide the Fira Code font files. +The newest version of the font files can be downloaded at the +[GitHub Fira Code Releases page](https://github.com/tonsky/FiraCode/releases). +Here is a sample preamble of a document: + + \documentclass{article} + \usepackage{fontspec} + \setmonofont{FiraCode-Regular.otf}[Contextuals=Alternate] + \usepackage{listings} + \usepackage[verbatim]{lstfiracode} + \lstset{style=FiraCodeStyle,basicstyle=\ttfamily} + +Contributing +------------ + +This package is maintained at https://github.com/RuixiZhang42/lstfiracode + +Issues and pull requests are welcome. + +Copyright and Licence +--------------------- + + Copyright (C) 2018 by Ruixi Zhang <ruixizhang42@gmail.com> + + This work may be distributed and/or modified under the + conditions of the LaTeX Project Public License, either version 1.3c + of this license or (at your option) any later version. + The latest version of this license is in + https://www.latex-project.org/lppl.txt + and version 1.3c 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 Ruixi Zhang. + + This work consists of the files lstfiracode.sty, + lstfiracode.tex, + README.md (this file) + and the derived file lstfiracode.pdf.
\ No newline at end of file diff --git a/macros/latex/contrib/lstfiracode/lstfiracode.pdf b/macros/latex/contrib/lstfiracode/lstfiracode.pdf Binary files differnew file mode 100644 index 0000000000..3e6cc3ab25 --- /dev/null +++ b/macros/latex/contrib/lstfiracode/lstfiracode.pdf diff --git a/macros/latex/contrib/lstfiracode/lstfiracode.sty b/macros/latex/contrib/lstfiracode/lstfiracode.sty new file mode 100644 index 0000000000..6901796861 --- /dev/null +++ b/macros/latex/contrib/lstfiracode/lstfiracode.sty @@ -0,0 +1,220 @@ +% +% Copyright (C) 2018 by Ruixi Zhang <ruixizhang42@gmail.com> +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c 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 Ruixi Zhang. +% +% This work consists of the files lstfiracode.sty, +% lstfiracode.tex, +% README.md +% and the derived file lstfiracode.pdf. +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lstfiracode}[% + 2018/12/24 v0.1c Use Fira Code font for listings] + +\RequirePackage{kvoptions} +\RequirePackage{listings} + +\DeclareBoolOption[false]{verbatim} +\DeclareDefaultOption{% + \PackageError{\@currname}{% + Unknown option `\CurrentOption'% + }{% + Available package options are:\MessageBreak + \space\space`verbatim=true' and\MessageBreak + \space\space`verbatim=false'% + }% +} +\ProcessKeyvalOptions* + +\let\lstfiracode@verbatim@nolig@list\verbatim@nolig@list +\newcommand*\ActivateVerbatimLigatures{% + \def\verbatim@nolig@list{\do\`\do\,\do\'}% +} +\newcommand*\DeactivateVerbatimLigatures{% + \def\verbatim@nolig@list{% + \do\`\do\<\do\>\do\,\do\'\do\-% + \do\w\do\*\do\/\do\:\do\=\do\!\do\~\do\[% + \do\#\do\(\do\?\do\_\do\.\do\;\do\&\do\|% + \do\+\do\$\do\@\do\%\do\]% Do "7B and "7D, impossible? + }% +} +\newcommand*\RestoreVerbatimBehavior{% + \let\verbatim@nolig@list\lstfiracode@verbatim@nolig@list +} + +\iflstfiracode@verbatim + \ActivateVerbatimLigatures +\fi + +\def\lstfiracode@lst@Literatekey#1\@nil@{% + \let\lst@ifxliterate\lst@if + \expandafter\def\expandafter\lst@literate\expandafter{\lst@literate#1}% +} +\lst@Key{moreliterate}{}{% + \@ifstar{\lst@true \lstfiracode@lst@Literatekey} + {\lst@false\lstfiracode@lst@Literatekey}#1\@nil@ +} + +\lstdefinestyle{FiraCodeStyle}{ + basewidth=0.6em, + literate= + {www}{{www}}3 + {**}{{**}}2 + {***}{{***}}3 +% {**/}{{**/}}3 % Removed in Fira Code v1.206 + {*>}{{*>}}2 +% {*/}{{*/}}2 % Interferes with comment highlighting +% {\\\\}{{\textbackslash\textbackslash}}2 % Removed in Fira Code v1.206 +% {\\\\\\}{{\textbackslash\textbackslash\textbackslash}}3 % Removed in Fira Code v1.206 +% {\{-}{{\{-}}2 % Removed in Fira Code v1.206 +% {[]}{{[]}}2 % Removed in Fira Code v1.206 + {::}{{::}}2 + {:::}{{:::}}3 + {:=}{{:=}}2 + {!!}{{!!}}2 +% {!!!}{{!!!}}3 % Removed in Fira Code v1.206 + {!=}{{!=}}2 + {!==}{{!==}}3 +% {-\}}{{-\}}}2 % Removed in Fira Code v1.206 + {--}{{--}}2 + {---}{{---}}3 + {-->}{{-->}}3 + {->}{{->}}2 + {->>}{{->>}}3 + {-<}{{-<}}2 + {-<<}{{-<<}}3 + {-~}{{-\textasciitilde}}2 + {\#\{}{{\#\{}}2 + {\#[}{{\#[}}2 + {\#\#}{{\#\#}}2 + {\#\#\#}{{\#\#\#}}3 + {\#\#\#\#}{{\#\#\#\#}}4 + {\#(}{{\#(}}2 + {\#?}{{\#?}}2 + {\#_}{{\#\_}}2 + {\#_(}{{\#\_(}}3 + {.-}{{.-}}2 + {.=}{{.=}}2 + {..}{{..}}2 + {..<}{{..<}}3 + {...}{{...}}3 + {?=}{{?=}}2 + {??}{{??}}2 +% {???}{{???}}3 % Removed in Fira Code v1.206 +% {;;}{{;;}}2 % Interferes with comment highlighting +% {;;;}{{;;;}}3 % Removed in Fira Code v1.206 +% {/*}{{/*}}2 % Interferes with comment highlighting +% {/**}{{/**}}3 % Removed in Fira Code v1.206 + {/=}{{/=}}2 + {/==}{{/==}}3 + {/>}{{/>}}2 +% {//}{{//}}2 % Interferes with comment highlighting +% {///}{{///}}3 % Interferes with comment highlighting + {\&\&}{{\&\&}}2 +% {\&\&\&}{{\&\&\&}}3 % Removed in Fira Code v1.206 + {||}{{||}}2 +% {|||}{{|||}}3 % Removed in Fira Code v1.206 + {||=}{{||=}}3 + {|=}{{|=}}2 + {|>}{{|>}}2 + {^=}{{\textasciicircum=}}2 + {$>}{{\$>}}2 + {++}{{++}}2 + {+>}{{+>}}2 + {=:=}{{=:=}}3 + {==}{{==}}2 + {===}{{===}}3 + {==>}{{==>}}3 + {=>}{{=>}}2 + {=>>}{{=>>}}3 +% {=<}{{=<}}2 % Removed in Fira Code v1.206 + {=<<}{{=<<}}3 +% {=~}{{=\textasciitilde}}2 % Removed in Fira Code v1.206 + {=/=}{{=/=}}3 + {>-}{{>-}}2 + {>=}{{>=}}2 + {>=>}{{>=>}}3 + {>>}{{>>}}2 + {>>-}{{>>-}}3 + {>>=}{{>>=}}3 + {>>>}{{>>>}}3 + {<*}{{<*}}2 + {<*>}{{<*>}}3 + {<|}{{<|}}2 + {<|>}{{<|>}}3 + {<$}{{<\$}}2 + {<$>}{{<\$>}}3 + {<!--}{{<!--}}4 + {<-}{{<-}}2 + {<--}{{<--}}3 + {<->}{{<->}}3 + {<+}{{<+}}2 + {<+>}{{<+>}}3 + {<=}{{<=}}2 + {<==}{{<==}}3 + {<=>}{{<=>}}3 + {<=<}{{<=<}}3 + {<>}{{<>}}2 + {<<}{{<<}}2 + {<<-}{{<<-}}3 + {<<=}{{<<=}}3 + {<<<}{{<<<}}3 + {<~}{{<\textasciitilde}}2 + {<~~}{{<\textasciitilde\textasciitilde}}3 + {</}{{</}}2 + {~@}{{\textasciitilde @}}2 + {~-}{{\textasciitilde-}}2 + {~=}{{\textasciitilde=}}2 + {~>}{{\textasciitilde>}}2 + {~~}{{\textasciitilde\textasciitilde}}2 + {~~>}{{\textasciitilde\textasciitilde>}}3 +% {~~~}{{\textasciitilde\textasciitilde\textasciitilde}}3 % Removed in Fira Code v1.206 + {\%\%}{{\%\%}}2 +% {\%\%\%}{{\%\%\%}}3 % Removed in Fira Code v1.206 + {<==>}{{<==>}}4 + {<||}{{<||}}3 + {<|||}{{<|||}}4 + {|||>}{{|||>}}4 + {</>}{{</>}}3 + {<~>}{{<\textasciitilde>}}3 + {<-<}{{<-<}}3 + {>->}{{>->}}3 + {=!=}{{=!=}}3 + {+++}{{+++}}3 + {||>}{{||>}}3 + {_|_}{{\_|\_}}3 + {..=}{{..=}}3 + {!!.}{{!!.}}3 + {::=}{{::=}}3 + {<:}{{<:}}2 + {>:}{{>:}}2 + {|-}{{|-}}2 + {|]}{{|]}}2 + {|\}}{{|\}}}2 + {__}{{\_\_}}2 + {?.}{{?.}}2 + {?:}{{?:}}2 + {.?}{{.?}}2 + {\#=}{{\#=}}2 + {\#!}{{\#!}}2 + {\#:}{{\#:}}2 + {-|}{{-|}}2 + {:<}{{:<}}2 + {:>}{{:>}}2 + {]\#}{{]\#}}2 + {[|}{{[|}}2 + {\{|}{{\{|}}2 +} + +\endinput diff --git a/macros/latex/contrib/lstfiracode/lstfiracode.tex b/macros/latex/contrib/lstfiracode/lstfiracode.tex new file mode 100644 index 0000000000..e40f1583c7 --- /dev/null +++ b/macros/latex/contrib/lstfiracode/lstfiracode.tex @@ -0,0 +1,332 @@ +% !TeX program = XeLaTeX +% !TeX encoding = UTF-8 Unicode +% +\documentclass[11pt]{article} +\frenchspacing +\setlength\parskip{1.5pt plus 1pt minus 0.5pt} +\usepackage{fontspec} +\setmainfont{TeX Gyre Pagella} +\linespread{1.05}\selectfont +\setsansfont{TeX Gyre Heros}[ + Scale=MatchLowercase +] +\setmonofont{Fira Code}[ + Scale=MatchLowercase, + Contextuals=Alternate +] +\newfontfamily\LMMono{Latin Modern Mono}[ + Scale=MatchLowercase +] +\usepackage{microtype} +\usepackage{xcolor} + +\usepackage{listings} +\usepackage[verbatim]{lstfiracode} +\lstset{ + language=C++, + style=FiraCodeStyle, + basicstyle=\ttfamily, + commentstyle=\color{orange} +} +\makeatletter +\lstnewenvironment{LaTeXlisting}{% + \RestoreVerbatimBehavior + \lst@CCPutMacro + \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{-{}}} + \@empty\z@\@empty + \lstset{ + style={}, + literate={}, + language=[LaTeX]TeX, + basicstyle=\small\LMMono, + basewidth=0.525em, + commentstyle=\itshape + }% +}{} +\makeatother + +\usepackage{booktabs} +\usepackage{hyperref} +\hypersetup{ + colorlinks=true +} +\usepackage{geometry} +\geometry{ + width=5.7in +} + +\newcommand*\myemail{ruixizhang42@gmail.com} +\newcommand*\dash{} +\DeclareRobustCommand\dash{% + \unskip\nobreak\thinspace\textemdash\thinspace\ignorespaces +} +\newcommand\versionhistory[3]{% + % #1: version number, #2: date, #3: description + \item[#1]#3\hfill#2% +} +\title{The \texttt{lstfiracode} package} +\author{Ruixi~Zhang\thanks{\href{mailto:\myemail}{\nolinkurl{\myemail}}.}} +\date{2018/12/24\enskip v0.1c} + +\begin{document} + +\maketitle + +\microtypesetup{protrusion=false} +\tableofcontents +\microtypesetup{protrusion=true} + +\section{Introduction} + +The Fira Code\footnote{See \url{https://github.com/tonsky/FiraCode}.} family +of fonts, created by Nikita Prokopov, is a monospaced typeface with +programming ligatures. +It is attempting for many people, me included, to use Fira Code for source +code listings. +However, the \verb|lstlisting| environment from the \verb|listings| package +does not support ligatures naively. To produce the desired output, one must +specify all necessary ligatures via the \verb|literate| key +of \verb|\lstset|, which can be tedious. + +The \verb|lstfiracode| package defines a ready-to-use \verb|listings| style, +\verb|FiraCodeStyle|, which pre-specifies 125 ligatures +(note that Fira Code v1.206 has 130 ligatures in total). +You may \emph{append} the remaining 5 ligatures to the \verb|FiraCodeStyle| +literate list via a new key \verb|moreliterate|, without unintentionally +erasing all existing ligatures via \verb|literate|. + +The \verb|lstfiracode| package also provides a package option, +\verb|verbatim|, along with three switches +\verb|\ActivateVerbatimLigatures|, \verb|\DeactivateVerbatimLigatures| +and \verb|\RestoreVerbatimBehavior| +to support source code listings using Fira Code +in the \verb|verbatim| environment. + +This package does \emph{not} provide the Fira Code font files. +The newest version of the fonts can be downloaded at +\url{https://github.com/tonsky/FiraCode/releases}. + +\section{Usage} + +To access \verb|FiraCodeStyle|, simply load \verb|lstfiracode| \emph{after} +\verb|listings|. Here is how you may setup your document: +\begin{LaTeXlisting} + \documentclass{article} + \usepackage{fontspec} + \setmonofont{FiraCode-Regular.otf}[ + BoldFont=FiraCode-Bold.otf, + Contextuals=Alternate % Activate the calt feature + ] + \usepackage{xcolor} + \usepackage{listings} + \usepackage[verbatim]{lstfiracode} % Activate ligatures in verbatim + \lstset{ + language=C++, + style=FiraCodeStyle, % Use predefined FiraCodeStyle + basicstyle=\ttfamily, % Use \ttfamily for source code listings + commentstyle=\color{orange} + } + \begin{document} + \begin{verbatim} + A<-www>>=B + \end{verbatim} + \begin{lstlisting} + /* A simple C++ program */ + int main() { + cout << "Hello World"; // prints Hello World + return 0; + } + \end{lstlisting} + \end{document} +\end{LaTeXlisting} +which produces the following \verb|verbatim| (observe the {\LMMono<-}, +the {\LMMono www} and the {\LMMono>>=} ligatures): +\begin{verbatim} + A<-www>>=B +\end{verbatim} +and the following \verb|lstlisting| (observe the {\LMMono++} +and the {\LMMono<<} ligatures): +\begin{lstlisting} + /* A simple C++ program */ + int main() { + cout << "Hello World"; // prints Hello World + return 0; + } +\end{lstlisting} + +\section{Package features} + +\subsection{Package option and user commands} + +The \verb|lstfiracode| package provides one package option and three user +commands, described below. + +You may load the \verb|lstfiracode| package with the option \verb|verbatim|, +or equivalently \verb|verbatim=true|. This activates all Fira Code ligatures +in the \verb|verbatim| environment. +\begin{LaTeXlisting} + % Activate Fira Code ligatures in verbatim + \usepackage[verbatim]{lstfiracode} + % is the same as + \usepackage[verbatim=true]{lstfiracode} +\end{LaTeXlisting} +Loading the package without any option (the default), or equivalently with +the option \verb|verbatim=false|, \emph{does not alter} how the +\verb|verbatim| environment is handled. +\begin{LaTeXlisting} + % Leave verbatim unaltered + \usepackage{lstfiracode} + % is the same as + \usepackage[verbatim=false]{lstfiracode} +\end{LaTeXlisting} + +You may change your mind in the middle of your document, so there are +three switches for such purpose: +\begin{description} +\item[\texttt{\textbackslash ActivateVerbatimLigatures}] +Activate all Fira Code ligatures in \verb|verbatim|. This is executed +automatically with the package option \verb|verbatim=true|. +\item[\texttt{\textbackslash DeactivateVerbatimLigatures}] +Suppress \emph{almost all} Fira Code ligatures in \verb|verbatim|. +Currently, it cannot break the {\LMMono\#\{} and the {\LMMono|\}} ligatures. +You should use Fira Mono if you wish to avoid ligatures altogether. +\item[\texttt{\textbackslash RestoreVerbatimBehavior}] +Restore how \verb|verbatim| is originally handled by \LaTeX. +\end{description} +These switches can overwrite each other and they act \emph{locally}. +For instance, the following three \verb|verbatim| environments +\begin{LaTeXlisting} + \begingroup + \ActivateVerbatimLigatures + \begin{verbatim} + A<-www>>=B % Fira Code ligatures activated + \end{verbatim} + \DeactivateVerbatimLigatures + \begin{verbatim} + A<-www>>=B % Fira Code ligatures deactivated + \end{verbatim} + \RestoreVerbatimBehavior + \begin{verbatim} + A<-www>>=B % Hmm... + \end{verbatim} + \endgroup +\end{LaTeXlisting} +produce, respectively, +\begingroup +\ActivateVerbatimLigatures +\begin{verbatim} + A<-www>>=B % Fira Code ligatures activated +\end{verbatim} +\DeactivateVerbatimLigatures +\begin{verbatim} + A<-www>>=B % Fira Code ligatures deactivated +\end{verbatim} +\RestoreVerbatimBehavior +\begin{verbatim} + A<-www>>=B % Hmm... +\end{verbatim} +\endgroup + +\subsection{The \texttt{FiraCodeStyle} listings style} + +The ligatures of Fira Code are treated as literate programming by the +\verb|lstfiracode| package. These ligatures are specified via the +\verb|literate| key in defining \verb|FiraCodeStyle|. +The definition of \verb|FiraCodeStyle| looks like this: +\begin{LaTeXlisting} + \lstdefinestyle{FiraCodeStyle}{ + basewidth=0.6em, + literate= + {www}{{www}}3 + ... % All other necessary ligatures in Fira Code + } +\end{LaTeXlisting} + +Thus, \verb|FiraCodeStyle| specifies \verb|basewidth| explicitly and +lists \emph{almost all} literate replacements. +\emph{It does not contain any font changing commands because users may load +Fira Code according to their preferences.} +In the case that \verb|\ttfamily| corresponds to Fira Code, +be sure to specify \verb|basicstyle=\ttfamily| \emph{in addition to} +\verb|style=FiraCodeStyle|, i.e., +\begin{LaTeXlisting} + \usepackage{listings} + \usepackage{lstfiracode} + % Assume that you have set Fira Code via \setmonofont + % Then remember to also specify basicstyle + \lstset{style=FiraCodeStyle,basicstyle=\ttfamily} +\end{LaTeXlisting} + +\subsection{The missing ligatures and the new key \texttt{moreliterate}} + +You may notice that some ligatures in Fira Code are still missing. Well, +there are 5 such ligatures\dash strictly speaking, they \emph{are} listed +as literate replacements in the definition of \verb|FiraCodeStyle|, +but are simply commented out: +\begin{center} +\LMMono +\begin{tabular}{c c c c c} +\toprule +\multicolumn{5}{c}{\rmfamily The ``missing'' ligatures} \\ +\midrule +/* & */ & // & /// & ;; \\ +\bottomrule +\end{tabular} +\end{center} +These particular combinations of characters usually indicate comment mode. +If they were to be implemented as literate replacements, they would break +how the \verb|listings| package handles comment highlighting. + +Nevertheless, you can still \emph{append} these ligatures to the +\verb|FiraCodeStyle| literate list. +Say, you want to activate the {\LMMono;;} ligature in your +{\LMMono C++} code. \emph{But you cannot simply write} +{\LMMono\textbackslash lstset\{style=FiraCodeStyle,% +literate=\{;;\}\{\{;;\}\}2\}} +\emph{because this will erase all predefined ligatures, leaving only the} +{\LMMono;;} \emph{ligature}. +Instead, you should use the new key\dash +\verb|moreliterate|\dash to add more literate replacements: +\begin{LaTeXlisting} + % Let's add more ligatures + \lstset{ + language=C++, + style=FiraCodeStyle, + basicstyle=\ttfamily, + moreliterate= + {;;}{{;;}}2 + {///}{{///}}3 + } +\end{LaTeXlisting} + +\section{Troubleshooting} + +The \verb|lstfiracode| package is maintained at GitHub. Please make each +bug report with a \emph{minimal example} at +\url{https://github.com/RuixiZhang42/lstfiracode/issues}. +Pull requests are welcome. + +\section*{Version history} + +\begin{description} +\versionhistory{v0.1c}{2018/12/24}{% + Removed \texttt{Ligatures=Common} + from \texttt{README.md} and \texttt{lstfiracode.tex} + (see \href{https://github.com/RuixiZhang42/lstfiracode/issues/1}{% + \#1}). + Re-implemented + \texttt{\textbackslash DeactivateVerbatimLigatures}.% +} +\versionhistory{v0.1b}{2018/12/20}{% + Updated \texttt{FiraCodeStyle} literate list. + Added \texttt{\textbackslash RestoreVerbatimBehavior}. + Re-implemented + \texttt{\textbackslash Activate}/% + \texttt{\textbackslash DeactivateVerbatimLigatures}.% +} +\versionhistory{v0.1a}{2018/12/16}{% + Initial release.% +} +\end{description} + +\end{document}
\ No newline at end of file |