From bddefbf234bbe8889456b2e1b09cce68cf590891 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 27 May 2013 01:20:56 +0000 Subject: skdoc 5/27 git-svn-id: svn://tug.org/texlive/trunk@30697 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/skdoc/skdoc.cls | 555 ++++++++++++++++++++++------ 1 file changed, 447 insertions(+), 108 deletions(-) (limited to 'Master/texmf-dist/tex/latex/skdoc') diff --git a/Master/texmf-dist/tex/latex/skdoc/skdoc.cls b/Master/texmf-dist/tex/latex/skdoc/skdoc.cls index 2c55dff1035..a03f7990f41 100644 --- a/Master/texmf-dist/tex/latex/skdoc/skdoc.cls +++ b/Master/texmf-dist/tex/latex/skdoc/skdoc.cls @@ -8,7 +8,7 @@ %% %% skdoc documentation class %% -%% Copyright (C) 2012 by Simon Sigurdhsson +%% Copyright (C) 2012-2013 by Simon Sigurdhsson %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -26,7 +26,7 @@ %% and the derived filebase skdoc.cls. \RequirePackage{expl3} \ProvidesExplClass{skdoc} - {2012/12/26}{1.0}{skdoc documentation class} + {2013/05/24}{1.3a}{skdoc documentation class} \PassOptionsToPackage{log-declarations=false}{xparse} \LoadClass[ DIV7, headings=big, @@ -35,15 +35,16 @@ bibliography=totocnumbered, index=totoc ]{scrartcl} -\RequirePackage{etoolbox,xstring,xparse,atbegshi,kvoptions} -\RequirePackage{verbatim,marginnote,calc,hyperref,multicol,hologo} +\RequirePackage{etoolbox,xstring,xparse,atbegshi,kvoptions,pdftexcmds} +\RequirePackage{verbatim,needspace,marginnote,calc,hyperref,multicol,hologo} \RequirePackage[nomain,xindy,numberedsection,order=letter, sanitize={description=false,sort=false}]{glossaries} \RequirePackage{ydoc-code,ydoc-desc} \RequirePackage[british]{babel} \RequirePackage[english=british]{csquotes} \RequirePackage[font=small,labelfont=bf,textfont=it]{caption} -\RequirePackage{scrpage2,PTSerif,ascii} +\RequirePackage{scrpage2,PTSerif} +\usepackage[scaled=1.03]{inconsolata} \RequirePackage[defaultsans,osfigures,scale=0.95]{opensans} \RequirePackage[babel]{microtype} \msg_new:nnn{skdoc}{key-exists}{File~key~"#1"~already~declared!} @@ -51,17 +52,249 @@ \msg_new:nnn{skdoc}{wrote-file}{Writing~things~to~file~"#1".} \msg_new:nnn{skdoc}{read-preamble}{Reading~preamble~from~file~"#1".} \msg_new:nnn{skdoc}{no-lppl}{Could~not~include~LPPL:~lppl.tex~does~not~exist!} +\msg_new:nnn{skdoc}{no-minted}{Syntax~highlighting~disabled:~couldn't~find~minted.sty!} +\msg_new:nnn{skdoc}{no-shell-escape}{Syntax~highlighting~disabled:~running~without~unrestricted~\string\write18.} +\msg_new:nnn{skdoc}{no-pygments}{Syntax~highlighting~disabled:~couldn't~find~"pygmentize".} +\msg_new:nnnn{skdoc}{bibtex-unsupported}{The `bibtex` package is unsupported: continue at own risk!}{Use a more modern bibliography system (i.e. `biblatex`) instead.} +\bool_new:N\g__skdoc_use_minted_bool +\bool_gset_false:N\g__skdoc_use_minted_bool +\bool_new:N\g__skdoc_no_index_bool +\bool_gset_false:N\g__skdoc_no_index_bool +\bool_new:N\g__skdoc_in_example_bool +\bool_gset_false:N\g__skdoc_in_example_bool +\bool_new:N\g__skdoc_with_implementation_bool +\bool_gset_true:N\g__skdoc_with_implementation_bool +\bool_new:N\g__skdoc_in_implementation_bool +\bool_gset_false:N\g__skdoc_in_implementation_bool +\prg_new_conditional:Nnn\__skdoc_if_print_code:{p,T,F,TF}{ + \bool_if:nTF{ + \g__skdoc_in_implementation_bool && + !\g__skdoc_with_implementation_bool + }{ + \prg_return_false: + }{ + \prg_return_true: + } +} \SetupKeyvalOptions{ family=skdoc, prefix=skdoc@ } \DeclareStringOption{load}[\jobname] +\DeclareBoolOption[true]{highlight} \ProcessKeyvalOptions* \IfStrEq{\skdoc@load}{}{}{% \IfFileExists{\skdoc@load.sty}{% \RequirePackage{\skdoc@load} }{} } +\prg_new_conditional:Nnn\__skdoc_if_shellescape:{T,F,TF}{ + \if_cs_exist:N\pdf@shellescape + \if_int_compare:w\pdf@shellescape=\c_one + \prg_return_true: + \else: + \prg_return_false: + \fi: + \else: + \prg_return_true: + \fi: +} +\cs_new:Npn\__skdoc_rm:n#1{ + \immediate\write18{rm~#1} +} +\prg_new_conditional:Nnn\__skdoc_if_pygmentize:{T,F,TF}{ + \immediate\write18{which~pygmentize~&&~touch~\jobname.aex} + \bool_set:Nn\l_tmpa_bool{\c_false_bool} + \file_if_exist:nT{\jobname.aex}{ + \__skdoc_rm:n{\jobname.aex} + \bool_set:Nn\l_tmpa_bool{\c_true_bool} + } + \if_bool:N\l_tmpa_bool + \prg_return_true: + \else: + \prg_return_false: + \fi: +} +\ifskdoc@highlight + \IfFileExists{\skdoc@load.sty}{ + \__skdoc_if_shellescape:TF{ + \__skdoc_if_pygmentize:TF{ + \bool_gset_true:N\g__skdoc_use_minted_bool + \RequirePackage{minted} + \renewcommand{\theFancyVerbLine}{ + \sffamily\tiny\textcolor{lightgray}{ + \oldstylenums{\arabic{FancyVerbLine}}} + } + \renewcommand\minted@usedefaultstyle{} + \def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} + \def\PY@tok##1{\csname PY@tok@##1\endcsname} + \def\PY@toks##1+{\ifx\relax##1\empty\else% + \PY@tok{##1}\expandafter\PY@toks\fi} + \def\PY@do##1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{##1}}}}}}} + \def\PY##1##2{\PY@reset\PY@toks##1+\relax+\PY@do{##2}} + \expandafter\def\csname PY@tok@gd\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@gu\endcsname{% + \let\PY@bf=\textbf% + \def\PY@tc####1{\textcolor{optioncolor}{####1}}} + \expandafter\def\csname PY@tok@gt\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@gs\endcsname{% + \let\PY@bf=\textbf} + \expandafter\def\csname PY@tok@gr\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@cm\endcsname{% + \let\PY@it=\textit% + \def\PY@tc####1{\textcolor{lightgray}{####1}}} + \expandafter\def\csname PY@tok@vg\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@m\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@mh\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@cs\endcsname{% + \let\PY@it=\textit% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@ge\endcsname{% + \let\PY@it=\textit} + \expandafter\def\csname PY@tok@vc\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@il\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@go\endcsname{% + \def\PY@tc####1{\textcolor{gray}{####1}}} + \expandafter\def\csname PY@tok@cp\endcsname{% + \def\PY@tc####1{\textcolor{sharp!75}{####1}}} + \expandafter\def\csname PY@tok@gi\endcsname{% + \def\PY@tc####1{\textcolor{bright}{####1}}} + \expandafter\def\csname PY@tok@gh\endcsname{% + \let\PY@bf=\textbf% + \def\PY@tc####1{\textcolor{section}{####1}}} + \expandafter\def\csname PY@tok@ni\endcsname{% + \let\PY@bf=\textbf% + \def\PY@tc####1{\textcolor{keydesc}{####1}}} + \expandafter\def\csname PY@tok@nn\endcsname{% + \let\PY@ul=\underline% + \def\PY@tc####1{\textcolor{black}{####1}}} + \expandafter\def\csname PY@tok@no\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@na\endcsname{% + \def\PY@tc####1{\textcolor{meta!50}{####1}}} + \expandafter\def\csname PY@tok@nb\endcsname{% + \def\PY@tc####1{\textcolor{black}{####1}}} + \expandafter\def\csname PY@tok@nc\endcsname{% + \let\PY@ul=\underline% + \def\PY@tc####1{\textcolor{bright}{####1}}} + \expandafter\def\csname PY@tok@nd\endcsname{% + \def\PY@tc####1{\textcolor{gray}{####1}}} + \expandafter\def\csname PY@tok@si\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@nf\endcsname{% + \def\PY@tc####1{\textcolor{bright}{####1}}} + \expandafter\def\csname PY@tok@s2\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@vi\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@nt\endcsname{% + \let\PY@bf=\textbf% + \def\PY@tc####1{\textcolor{meta!50}{####1}}} + \expandafter\def\csname PY@tok@nv\endcsname{% + \def\PY@tc####1{\textcolor{scriptcolor}{####1}}} + \expandafter\def\csname PY@tok@s1\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@gp\endcsname{% + \def\PY@tc####1{\textcolor{gray}{####1}}} + \expandafter\def\csname PY@tok@sh\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@ow\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@sx\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@bp\endcsname{% + \def\PY@tc####1{\textcolor{black}{####1}}} + \expandafter\def\csname PY@tok@c1\endcsname{% + \let\PY@it=\textit% + \def\PY@tc####1{\textcolor{lightgray}{####1}}} + \expandafter\def\csname PY@tok@kc\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@c\endcsname{% + \let\PY@it=\textit% + \def\PY@tc####1{\textcolor{lightgray}{####1}}} + \expandafter\def\csname PY@tok@mf\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@err\endcsname{% + \def\PY@tc####1{\textcolor{intlink}{####1}}% + \def\PY@bc####1{\setlength{\fboxsep}{0pt}% + \colorbox{bright}{\strut ####1}}} + \expandafter\def\csname PY@tok@kd\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@ss\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@sr\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@mo\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@mi\endcsname{% + \def\PY@tc####1{\textcolor{meta}{####1}}} + \expandafter\def\csname PY@tok@kn\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@kr\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@s\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@kp\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@w\endcsname{% + \def\PY@tc####1{\textcolor{lightgray}{####1}}} + \expandafter\def\csname PY@tok@kt\endcsname{% + \def\PY@tc####1{\textcolor{black}{####1}}} + \expandafter\def\csname PY@tok@sc\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@sb\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@k\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \expandafter\def\csname PY@tok@se\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@sd\endcsname{% + \def\PY@tc####1{\textcolor{sharp}{####1}}} + \expandafter\def\csname PY@tok@nl\endcsname{% + \def\PY@tc####1{\textcolor{bright}{####1}}} + \expandafter\def\csname PY@tok@ne\endcsname{% + \def\PY@tc####1{\textcolor{bright}{####1}}} + \expandafter\def\csname PY@tok@o\endcsname{% + \def\PY@tc####1{\textcolor{macroimpl}{####1}}} + \def\PYZbs{\char`\\} + \def\PYZus{\char`\_} + \def\PYZob{\char`\{} + \def\PYZcb{\char`\}} + \def\PYZca{\char`\^} + \def\PYZam{\char`\&} + \def\PYZlt{\char`\<} + \def\PYZgt{\char`\>} + \def\PYZsh{\char`\#} + \def\PYZpc{\char`\%} + \def\PYZdl{\char`\$} + \def\PYZhy{\char`\-} + \def\PYZsq{\char`\'} + \def\PYZdq{\char`\"} + \def\PYZti{\char`\~} + \def\PYZat{@} + \def\PYZlb{[} + \def\PYZrb{]} + }{ + \msg_warning:nn{skdoc}{no-pygments} + } + }{ + \msg_warning:nn{skdoc}{no-shell-escape} + } + }{ + \msg_warning:nn{skdoc}{no-minted} + } +\fi \tl_new:N\skdoc@temptl \ior_new:N\skdoc@input \iow_new:N\skdoc@output @@ -76,13 +309,15 @@ \def\skdoc@preamble{}% \def\skdoc@key{#2}% \IfNoValueTF{#1}{}{\keys_set:nn{skdoc@declarefile}{#1}} - \tl_new:c{skdoc@output@\skdoc@key} \int_if_exist:cTF{skdoc@output@\skdoc@key @line}{ \msg_critical:nnx{skdoc}{key-exists}{\skdoc@key} }{ \int_zero_new:c{skdoc@output@\skdoc@key @line} } - \IfStrEq{\skdoc@preamble}{}{}{ + \tl_new:c{skdoc@output@\skdoc@key} + \IfStrEq{\skdoc@preamble}{}{ + \def\skdoc@preamble@extra{} + }{ \tl_set:Nx\l_tmpa_tl{\skdoc@preamble} \edef\skdoc@temp{\tl_head:N\l_tmpa_tl} \def\skdoc@preamble@extra{ @@ -102,60 +337,116 @@ \AfterEndDocument{\csname skdoc@write@#2\endcsname} \group_end: } +\clist_new:N\l__skdoc_keys \DeclareDocumentEnvironment{skdoc@verbatim}{m}{% - \iftoggle{skdoc@impl}{\@bsphack}{} - \def\skdoc@key{#1} - \int_if_exist:cTF{skdoc@output@\skdoc@key @line}{}{ - \msg_critical:nnx{skdoc}{key-nexists}{\skdoc@key} - }% - \marginnote{ - \leavevmode - \llap{ - \scriptsize\color{gray} - $\langle$\skdoc@key$\rangle$ - \makebox[2ex]{\strut} + \clist_set:Nn\l__skdoc_keys{#1} + \clist_map_inline:Nn\l__skdoc_keys{ + \int_if_exist:cTF{skdoc@output@##1@line}{}{ + \msg_critical:nnn{skdoc}{key-nexists}{##1} + }% + \int_compare:nNnT{\int_use:c{skdoc@output@##1@line}}=\c_zero% + {\int_gincr:c{skdoc@output@##1@line}}% + } + \__skdoc_if_print_code:T{ + \bool_if:NTF\g__skdoc_use_minted_bool{ + \minted@resetoptions% + \exp_args:Nnx\setkeys{minted@opt}{ + \int_compare:nNnF{\clist_count:N\l__skdoc_keys}>\c_one{ + \bool_if:NF\g__skdoc_in_example_bool{linenos,} + firstnumber=\int_use:c{skdoc@output@#1@line} + } + }% + \iow_open:Nn\minted@code{\jobname.pyg}% + \Needspace*{2\baselineskip}% + }{ + \bool_if:NF\g__skdoc_in_example_bool{\@bsphack}% + } + \bool_if:NF\g__skdoc_in_example_bool{ + \marginnote{ + \leavevmode + \llap{ + \scriptsize\color{gray} + $\langle$#1$\rangle$ + \makebox[2ex]{\strut} + } + } } } \def\verbatim@processline{% - \tl_gput_right:cx{skdoc@output@\skdoc@key}{\the\verbatim@line\iow_newline:}% - \int_gincr:c{skdoc@output@\skdoc@key @line}% - \iftoggle{skdoc@impl}{ - \noindent\leavevmode% - \hspace*{-5ex} - \begin{minipage}[c][1ex]{\textwidth} - \makebox[4ex]{% - \leavevmode - \tiny\color{lightgray}\hfill% - \int_use:c{skdoc@output@\skdoc@key @line}% - }% - \hspace*{1ex}% - { - \verbatim@font\footnotesize - \the\verbatim@line - } - \end{minipage} - \vskip-.75ex\par - }{} + \clist_map_inline:Nn\l__skdoc_keys{ + \tl_gput_right:cx{skdoc@output@####1}{\the\verbatim@line\iow_newline:}% + } + \__skdoc_if_print_code:T{ + \bool_if:NTF\g__skdoc_use_minted_bool{ + \iow_now:Nx\minted@code{\the\verbatim@line}% + }{ + \noindent\leavevmode% + \bool_if:NF\g__skdoc_in_example_bool{\hspace*{-5ex}} + \begin{minipage}[c][1ex]{\textwidth} + \bool_if:nF{ + \g__skdoc_in_example_bool && + !\int_compare_p:nNn{\clist_count:N\l__skdoc_keys}>\c_one + }{ + \makebox[4ex]{% + \leavevmode + \sffamily\tiny\color{lightgray}\hfill% + \clist_map_inline:Nn\l__skdoc_keys{ + \oldstylenums{\int_use:c{skdoc@output@####1@line}}% + } + }% + \hspace*{1ex}% + } + { + \verbatim@font + \the\verbatim@line + } + \end{minipage} + \par + } + } + \clist_map_inline:Nn\l__skdoc_keys{ + \int_gincr:c{skdoc@output@####1@line}% + } }% + \group_begin: \let\do\@makeother\dospecials\catcode`\^^M\active% - \iftoggle{skdoc@impl}{ + \bool_if:nT{ + \__skdoc_if_print_code_p: && + !\g__skdoc_use_minted_bool + }{ \frenchspacing\@vobeyspaces - }{} + } \verbatim@start% }{% - \iftoggle{skdoc@impl}{\@esphack}{}% + \group_end: + \__skdoc_if_print_code:T{ + \bool_if:NTF\g__skdoc_use_minted_bool{ + \iow_close:N\minted@code% + \bool_if:NF\g__skdoc_in_example_bool{ + \vspace*{-\topsep} + \vspace*{-\partopsep} + \vspace*{-\parskip} + } + \minted@pygmentize{latex}% + \DeleteFile{\jobname.pyg}% + \vspace*{-\topsep} + \vspace*{-\partopsep} + }{ + \bool_if:NF\g__skdoc_in_example_bool{\@esphack}% + } + }% } \DeclareDocumentEnvironment{MacroCode}{m}{ - \iftoggle{skdoc@impl}{ + \__skdoc_if_print_code:T{ \vspace{.2\baselineskip} - \par\noindent - }{} + \bool_if:NF\g__skdoc_use_minted_bool{\par\noindent} + } \skdoc@verbatim{#1} }{ \endskdoc@verbatim - \iftoggle{skdoc@impl}{ + \__skdoc_if_print_code:T{ \vspace{.5\baselineskip} - }{} + } } \DeclareDocumentCommand\PreambleTo{mm}{% \group_begin: @@ -212,47 +503,45 @@ citecolor=black, urlcolor=extlink } -\newtoggle{skdoc@noindex} -\togglefalse{skdoc@noindex} \DeclareDocumentCommand\cs{sm}{ \texttt{\char`\\#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@macro{#2}} } } \DeclareDocumentCommand\env{sm}{ \texttt{#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@environment{#2}} } } \DeclareDocumentCommand\pkg{sm}{ \textsf{#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@package{#2}} } } \DeclareDocumentCommand\opt{sm}{ \texttt{#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@option{#2}} } } \DeclareDocumentCommand\bib{sm}{ \texttt{@#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@bibentry{#2}} } } \DeclareDocumentCommand\thm{sm}{ \textrm{#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@theme{#2}} } } \DeclareDocumentCommand\file{sm}{ \texttt{#2} - \iftoggle{skdoc@noindex}{}{ + \bool_if:NF\g__skdoc_no_index_bool{ \IfBooleanTF{#1}{}{\index@file{#2}} } } @@ -332,14 +621,14 @@ \Options{#1} } \def\skdoc@WithValues@peek{ - \ifx\@let@token\AndDefault\else\par\noindent\nobreak\fi + \ifx\@let@token\AndDefault\else\par\noindent\nobreak\ignorespaces\fi } \DeclareDocumentCommand\WithValues{m}{ \noindent\makebox[\linewidth][l]{\texttt{#1}} \futurelet\@let@token\skdoc@WithValues@peek } \DeclareDocumentCommand\AndDefault{m}{ - \llap{\textcolor{gray}{\texttt{(#1)}}}\par\noindent\nobreak + \llap{\textcolor{gray}{\texttt{(#1)}}}\par\noindent\nobreak\ignorespaces } \DeclareDocumentCommand\BibEntry{m}{ \marginnote{ @@ -355,25 +644,75 @@ \textcolor{gray}{\texttt{,#2}} } } - \par\noindent\nobreak + \par\noindent\nobreak\ignorespaces } \DeclareDocumentCommand\Theme{m}{ \marginnote{ \index@theme*{#1} \hfill\llap{\textcolor{macrodesc}{\thm{#1}}} } - \nobreak\par\noindent\nobreak + \nobreak\par\noindent\nobreak\ignorespaces } \DeclareDocumentCommand\DescribeFile{m}{ \marginnote{ \index@file*{#1} \hfill\llap{\textcolor{macrodesc}{\file{#1}}} } - \nobreak\par\noindent\nobreak + \nobreak\par\noindent\nobreak\ignorespaces } +\dim_const:Nn\c__skdoc_example_margin_dim{0.5\baselineskip} +\dim_const:Nn\c__skdoc_example_linewidth_dim{1pt} +\coffin_new:N\l__skdoc_example_code_coffin +\coffin_new:N\l__skdoc_example_divider_coffin +\coffin_new:N\l__skdoc_example_result_coffin \DeclareDocumentEnvironment{example}{}{ - \minisec{Example:} -}{} + \bool_gset_true:N\g__skdoc_in_example_bool% + \minisec{Example:}% + \int_zero_new:c{skdoc@output@skdoc@private@example@line}% + \tl_if_exist:cTF{skdoc@output@skdoc@private@example}{ + \tl_clear:c{skdoc@output@skdoc@private@example} + }{ + \tl_new:c{skdoc@output@skdoc@private@example} + } + \dim_set:Nn\l_tmpa_dim{ \textwidth/2 + -\c__skdoc_example_margin_dim + -\c__skdoc_example_linewidth_dim/2} + \coffin_clear:N\l__skdoc_example_code_coffin + \vcoffin_set:Nnw\l__skdoc_example_code_coffin{\l_tmpa_dim} + \skdoc@verbatim{skdoc@private@example} +}{ + \endskdoc@verbatim + \vcoffin_set_end: + \coffin_clear:N\l__skdoc_example_result_coffin + \vcoffin_set:Nnw\l__skdoc_example_result_coffin{\l_tmpa_dim} + \iow_open:Nn\skdoc@output{\jobname.skdoc.tmp} + \iow_now:Nx\skdoc@output{\tl_to_str:c{skdoc@output@skdoc@private@example}} + \iow_close:N\skdoc@output + \input{\jobname.skdoc.tmp} + \vcoffin_set_end: + \coffin_clear:N\l__skdoc_example_divider_coffin + \dim_set:Nn\l_tmpa_dim{ + \dim_max:nn{\coffin_ht:N\l__skdoc_example_code_coffin}% + {\coffin_ht:N\l__skdoc_example_result_coffin} + + 2\c__skdoc_example_margin_dim} + \hcoffin_set:Nn\l__skdoc_example_divider_coffin{ + \color{lightgray} + \hspace*{\c__skdoc_example_margin_dim} + \rule{\c__skdoc_example_linewidth_dim}{\l_tmpa_dim} + \hspace*{\c__skdoc_example_margin_dim} + } + \coffin_clear:N\l_tmpa_coffin + \coffin_set_eq:NN\l_tmpa_coffin\l__skdoc_example_divider_coffin + \coffin_join:NnnNnnnn\l_tmpa_coffin{l}{vc}% + \l__skdoc_example_result_coffin{r}{vc}% + {0pt}{0pt} + \coffin_join:NnnNnnnn\l_tmpa_coffin{r}{vc}% + \l__skdoc_example_code_coffin{l}{vc}% + {0pt}{0pt} + \coffin_typeset:Nnnnn\l_tmpa_coffin{T}{l}{0pt}{0pt} + \bool_gset_false:N\g__skdoc_in_example_bool% + \vspace*{\c__skdoc_example_margin_dim}\par +} \DeclareDocumentEnvironment{macro}{smo}{% \@bsphack \index@macro!{\expandafter\@gobble\string#2} @@ -381,7 +720,7 @@ \IfBooleanTF{#1}{ \IfNoValueTF{#3}{}{ \int_compare:nNnTF{#3}>{0}{ - \cs:w use_none:\prg_replicate:nn{#3}{n}\cs_end: + \use:c{use_none:\prg_replicate:nn{#3}{n}} }{} } }{ @@ -401,7 +740,7 @@ \IfBooleanTF{#1}{ \IfNoValueTF{#3}{}{ \int_compare:nNnTF{#3}>{0}{ - \cs:w use_none:\prg_replicate:nn{#3}{n}\cs_end: + \use:c{use_none:\prg_replicate:nn{#3}{n}} }{} } }{ @@ -467,9 +806,11 @@ \DeclareDocumentEnvironment{theme*}{m}% {\begin{theme}*{#1}}{\end{theme}} \def\PrintEnvImplName#1{% - \par\mbox{} - \marginnote{\llap{\implstyle{#1}}} - \par + \par\leavevmode\null + \hbox{% + \marginnote{\llap{\implstyle{#1\strut}}}% + } + \null } \def\PrintMacroImpl#1{% \par @@ -508,21 +849,20 @@ \vspace*{-\baselineskip} \par\noindent{#1\strut}\par\medskip% } -\prg_new_conditional:Nnn\__skdoc_do_index:{p}{ - \iftoggle{skdoc@impl}{ +\prg_new_conditional:Nnn\__skdoc_if_do_index:{p,T,F,TF}{ + \bool_if:nTF{ + \__skdoc_if_print_code_p: && + !\g__skdoc_no_index_bool + }{ \prg_return_true: }{ - \iftoggle{skdoc@in@impl}{ - \prg_return_false: - }{ - \prg_return_true: - } + \prg_return_false: } } \DeclareDocumentCommand\@index@{mm}{ - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \@index@@{#1}{#2} - \fi: + } } \DeclareDocumentCommand\@index@@{mm}{ \newglossaryentry{index-#1}{ @@ -537,7 +877,7 @@ \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{#3}{\cs*{#3}} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -547,14 +887,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@environment{st!m}{ \def\skdoc@temp{\string#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{\string#3}{\env*{\string#3}~(environment)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -564,14 +904,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@option{st!m}{ \def\skdoc@temp{\string#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{\string#3}{\opt*{\string#3}~(option)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -581,14 +921,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@bibentry{st!m}{ \def\skdoc@temp{#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{#3}{\bib*{#3}~(\hologoRobust{BibTeX}~entry~type)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -598,14 +938,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@theme{st!m}{ \def\skdoc@temp{\string#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{\string#3}{\thm*{\string#3}~(theme)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -615,14 +955,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@package{st!m}{ \def\skdoc@temp{\string#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{\string#3}{\pkg*{\string#3}~(package)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -632,14 +972,14 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \DeclareDocumentCommand\index@file{st!m}{ \def\skdoc@temp{\string#3} \ifglsentryexists{index-\skdoc@temp}{}{ \@index@{\string#3}{\file*{\string#3}~(file)} } - \if_predicate:w\__skdoc_do_index_p: + \__skdoc_if_do_index:T{ \IfBooleanTF{#2}{ \glsadd[types=index,format=hyperul]{index-\skdoc@temp} }{ @@ -649,7 +989,7 @@ \glsadd[types=index]{index-\skdoc@temp} } } - \fi: + } } \ProvideDocumentCommand\hyperul{m}{ \underline{\hyperup{#1}} @@ -658,14 +998,14 @@ \glossarystyle{indexgroup} \renewcommand*{\glspostdescription}{\unskip\leaders\hbox to 2.9mm{\hss.}\hfill\strut} \renewenvironment{theglossary}{ - \toggletrue{skdoc@noindex} + \bool_gset_true:N\g__skdoc_no_index_bool \begin{multicols}{2} \setlength{\parindent}{0pt} \setlength{\parskip}{0pt plus 0.3pt} \let\item\@idxitem }{ \end{multicols} - \togglefalse{skdoc@noindex} + \bool_gset_false:N\g__skdoc_no_index_bool } \renewcommand*{\glossaryentryfield}[5]{ \item\glsentryitem{##1}\glstarget{##1}{##2} @@ -687,7 +1027,7 @@ \providecommand*\PrintIndex{% \begingroup \renewcommand*{\glossarypreamble}{ - Numbers~written~in~boldface~refer~to~the~page~where~the~ + Numbers~written~in~italic~refer~to~the~page~where~the~ corresponding~entry~is~described;~numbers~underlined~refer~ to~the~page~were~the~implementation~of~the~corresponding~ entry~is~discussed.~Numbers~in~roman~refer~to~other~ @@ -758,11 +1098,11 @@ \newglossarystyle{changelog}{ \glossarystyle{altlist} \renewenvironment{theglossary}{ - \toggletrue{skdoc@noindex} + \bool_gset_true:N\g__skdoc_no_index_bool \begin{multicols}{2}\begin{description} }{ \end{description}\end{multicols} - \togglefalse{skdoc@noindex} + \bool_gset_false:N\g__skdoc_no_index_bool } \renewcommand*{\glossaryentryfield}[5]{ \par\vspace{5\p@}\relax @@ -782,21 +1122,17 @@ \printglossary[type=changes,style=changelog] \endgroup } -\newtoggle{skdoc@impl} -\newtoggle{skdoc@in@impl} -\toggletrue{skdoc@impl} -\togglefalse{skdoc@in@impl} \newcounter{skdoc@impl@page} \AtBeginShipout{ - \iftoggle{skdoc@impl}{}{ - \iftoggle{skdoc@in@impl}{\AtBeginShipoutDiscard}{} - } + \__skdoc_if_print_code:F{\AtBeginShipoutDiscard} +} +\DeclareDocumentCommand\OnlyDescription{}{ + \bool_gset_false:N\g__skdoc_with_implementation_bool } -\DeclareDocumentCommand\OnlyDescription{}{\togglefalse{skdoc@impl}} \DeclareDocumentCommand\Implementation{}{ - \iftoggle{skdoc@impl}{}{ + \bool_if:NF\g__skdoc_with_implementation_bool{ \clearpage - \toggletrue{skdoc@in@impl} + \bool_gset_true:N\g__skdoc_in_implementation_bool \let\skdoc@old@part\part \DeclareDocumentCommand\part{som}{} \let\skdoc@old@section\section @@ -809,13 +1145,15 @@ \DeclareDocumentCommand\paragraph{som}{} \let\skdoc@old@subparagraph\subparagraph \DeclareDocumentCommand\subparagraph{som}{} + \cs_if_exist:NTF\refsection{\refsection}{} \setcounter{skdoc@impl@page}{\value{page}} } } \DeclareDocumentCommand\Finale{}{ - \iftoggle{skdoc@impl}{}{ + \bool_if:NF\g__skdoc_with_implementation_bool{ + \cs_if_exist:NTF\refsection{\printbibliography\endrefsection}{} \clearpage - \togglefalse{skdoc@in@impl} + \bool_gset_false:N\g__skdoc_in_implementation_bool \let\part\skdoc@old@part \let\section\skdoc@old@section \let\subsection\skdoc@old@subsection @@ -967,11 +1305,11 @@ \AtEndDocument{\addtocontents{toc}{\par}} \let\old@tableofcontents\tableofcontents \DeclareDocumentCommand\tableofcontents{}{ - \toggletrue{skdoc@noindex} + \bool_gset_true:N\g__skdoc_no_index_bool \microtypesetup{protrusion=false} \old@tableofcontents \microtypesetup{protrusion=true} - \togglefalse{skdoc@noindex} + \bool_gset_false:N\g__skdoc_no_index_bool } \DeclareDocumentCommand\PrintLPPL{}{ \begingroup @@ -1040,6 +1378,7 @@ \ifdefined\defbibheading \defbibheading{bibliography}[\bibname]{\section{#1}} \fi + \@ifpackageloaded{bibtex}{\msg_warning:nn{skdoc}{bibtex-unsupported}}{} } \AtBeginDocument{\reversemarginpar} \endinput -- cgit v1.2.3