Created
August 7, 2022 16:36
-
-
Save zr-tex8r/d9cbbfa2faf54a02cc80c44445a98152 to your computer and use it in GitHub Desktop.
新しい画期的なLaTeX実装⛄
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\input sclatex | |
\dump |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%% | |
%% This is file 'sclatex.tex'. | |
%% | |
%% Copyright (c) 2022 Takayuki YATO (aka. "ZR") | |
%% GitHub: https://github.com/zr-tex8r | |
%% Twitter: @zr_tex8r | |
%% | |
%% This package is distributed under the MIT License. | |
%% | |
% | |
%--------------------------------------- prologue | |
% | |
%% avoid multiple loading | |
\csname\if11sclxLoaded\fi\endcsname% | |
\let\sclxLoaded\endinput% | |
% | |
%% check current format | |
\chardef\sclxEqCC\catcode61\catcode61\catcode48% | |
\chardef\sclxSpCC\catcode32\catcode32=10\relax% | |
\chardef\sclxFormat=0 % unknown | |
\ifnum\catcode35=12 \ifnum\catcode123=12 \ifnum\catcode125=12 % | |
\chardef\sclxFormat=1 % iniTeX | |
\fi\fi\fi% | |
\ifnum\catcode35=6 \ifnum\catcode123=1 \ifnum\catcode125=2 % | |
\def\sclxTempA{plain}\ifx\fmtname\sclxTempA% | |
\chardef\sclxFormat=2 % plain | |
\fi% | |
% but \fmtname of plain (u)pTeX is weird... | |
\def\sclxTempA{ptex}\ifx\fmtname\sclxTempA% | |
\chardef\sclxFormat=2 % | |
\fi% | |
\def\sclxTempA{uptex}\ifx\fmtname\sclxTempA% | |
\chardef\sclxFormat=2 % | |
\fi% | |
\fi\fi\fi% | |
\ifnum\sclxFormat=0 % quit when format is unknown | |
\begingroup \catcode123=1 \catcode125=2 \catcode58=12 % | |
\errhelp{This is fatal error. Process is aborted.}% | |
\errmessage{scLaTeX Error: Unsupported format}% | |
\endgroup% | |
\catcode61\sclxEqCC \catcode32\sclxSpCC% | |
\sclxLoaded\fi\relax% | |
% | |
% when in INI-mode, load plain.tex | |
\ifnum\sclxFormat=1 % | |
\endlinechar=13 \catcode13=5 % | |
\chardef\sclxEqCC=12 \chardef\sclxSpCC=10 % don't restore | |
\input plain % | |
\fi% | |
% | |
% code guards | |
\edef\sclxTempA{% | |
\catcode61=\the\sclxEqCC% | |
\catcode32=\the\sclxSpCC% | |
\catcode13=\the\catcode13% | |
\catcode33=\the\catcode33% | |
\catcode34=\the\catcode34% | |
\catcode39=\the\catcode39% | |
\catcode40=\the\catcode40% | |
\catcode41=\the\catcode41% | |
\catcode42=\the\catcode42% | |
\catcode43=\the\catcode43% | |
\catcode45=\the\catcode45% | |
\catcode46=\the\catcode46% | |
\catcode47=\the\catcode47% | |
\catcode58=\the\catcode58% | |
\catcode59=\the\catcode59% | |
\catcode60=\the\catcode60% | |
\catcode62=\the\catcode62% | |
\catcode63=\the\catcode63% | |
\catcode64=\the\catcode64% | |
\catcode91=\the\catcode91% | |
\catcode93=\the\catcode93% | |
\catcode94=\the\catcode94% | |
\catcode96=\the\catcode96% | |
\catcode124=\the\catcode124% | |
\endlinechar=\the\endlinechar% | |
\relax}% | |
\catcode13=5 \endlinechar=13 % | |
\catcode33=12 % <!> | |
\catcode34=12 % <"> | |
\catcode39=12 % <'> | |
\catcode40=12 % <(> | |
\catcode41=12 % <)> | |
\catcode42=12 % <*> | |
\catcode43=12 % <+> | |
\catcode45=12 % <-> | |
\catcode46=12 % <.> | |
\catcode47=12 % </> | |
\catcode58=12 % <:> | |
\catcode59=12 % <;> | |
\catcode60=12 % <<> | |
\catcode62=12 % <>> | |
\catcode63=12 % <?> | |
\catcode64=11 % <@> | |
\catcode91=12 % <[> | |
\catcode93=12 % <]> | |
\catcode94=7 % <^> | |
\catcode96=12 % <`> | |
\catcode124=12 % <|> | |
\let\sclx@restore@codes\sclxTempA | |
\let\sclxTempA\relax | |
%% declarations | |
\def\sclxFmtName{scLaTeX} | |
\def\sclxFmtVersion{2022-08-08} | |
\ifx\bxDebug\@undefined \long\def\bxDebug#1{} \fi | |
\def\sclx@debug#1{\bxDebug{\sclxFmtName> #1}} | |
%--------------------------------------- job start-up | |
%% \sclx@show@banner | |
\edef\sclx@show@banner{% | |
\immediate\write128{\sclxFmtName\space<\sclxFmtVersion>}% | |
} | |
%% show the banner | |
\ifnum\sclxFormat=1 % iniTeX | |
\everyjob\expandafter{\the\everyjob\sclx@show@banner} | |
\fi | |
\sclx@show@banner | |
%--------------------------------------- general | |
%% layout parameters | |
\let\sclxDVIDriver\relax | |
\newdimen\sclxPaperWidth | |
\newdimen\sclxPaperHeight | |
\newcount\sclxColumnCount | |
\def\sclxMufflerColor{red,blue} | |
%% packages | |
\input ifluatex.sty | |
\input ifpdf.sty | |
\input infwarerr.sty | |
\input kvdefinekeys.sty | |
\input kvsetkeys.sty | |
\input ltxcmds.sty | |
%% unique tokens | |
\def\sclx@end{\sclx@end@} | |
\let\sclx@mk\indent % unexpandable | |
%% variables | |
\newif\ifsclx@ok | |
\newif\ifsclx@process@ok | |
\newif\ifsclx@landscape | |
\newif\ifsclx@meta@column@count | |
\newcount\sclx@cnta | |
\newcount\sclx@cntb | |
\let\sclx@driver\relax | |
\let\sclx@option@list\relax | |
\let\sclx@class@name\relax | |
\let\sclx@metadata\relax | |
%% \sclx@org@end : primitive '\end' | |
\let\sclx@org@end\end | |
%% \sclx@typeout{<message>} | |
% NB. \typeout is equated to it if undefined. | |
\def\sclx@typeout#1{% | |
\begingroup | |
\immediate\write\sclx@term{#1}% | |
\endgroup | |
} | |
\chardef\sclx@term=\ifluatex 128 \else 16 \fi | |
\ifx\typeout\@undefined | |
\let\typeout\sclx@typeout | |
\fi | |
%% \sclx@cond\ifXXX...\fi{<true>}{<false>} | |
\ltx@gobbletwo\if\if \def\sclx@cond#1\fi{% | |
#1\expandafter\ltx@firstoftwo\else\expandafter\ltx@secondoftwo\fi | |
} | |
%% \sclx@check@same@str{<str1>}{<str2>} | |
% Sets switch sclx@ok. | |
\def\sclx@check@same@str#1#2{% | |
\sclx@okfalse | |
\begingroup | |
\edef\sclx@next{#1}\edef\sclx@next{\meaning\sclx@next}% | |
\edef\sclx@tmpa{#2}\edef\sclx@tmpa{\meaning\sclx@tmpa}% | |
\ifx\sclx@next\sclx@tmpa \aftergroup\sclx@oktrue \fi | |
\endgroup | |
} | |
%% \sclx@check@primitive\CS | |
% Sets switch sclx@ok. | |
\def\sclx@check@primitive#1{% | |
\sclx@okfalse | |
\begingroup | |
\edef\sclx@tmpa{\meaning#1}\edef\sclx@tmpb{\string#1}% | |
\ifx\sclx@tmpa\sclx@tmpb \aftergroup\sclx@oktrue \fi | |
\endgroup | |
} | |
%% \sclx@exit | |
% Stops reading this file. | |
% For safety it should be used either as: | |
% \sclx@exit% | |
% \sclx@exit\fi% | |
\def\sclx@exit{% | |
\sclxLoaded | |
\sclx@restore@codes | |
} | |
%--------------------------------------- error messages | |
%% \sclx@cute@oops / \sclx@shrieks | |
\begingroup | |
\def\do#1{\catcode`#1=12\relax}\def\nxt{\gdef\sclx@shrieks} | |
\catcode`\^^?=14 \catcode`\^^\=0 \catcode`\^^[=1 \catcode`\^^]=2 | |
\endlinechar=10 \catcode10=12 \catcode96=7 | |
\dospecials``\gdef``\sclx@cute@oops``[``? | |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
! ____ | |
! ___HHHH _____ ``\sclxFmtName ERROR! | |
! / . . \ |Oops!| Something is wrong! | |
! \ --- / |~~~~~ | |
! V :#######: Y | |
! \/ o*"*\/ | |
! { o } | |
! \_______/ Cheers!!``]``\nxt``[``? | |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]``? | |
``\endgroup% NICE! | |
%% \sclx@error{<message>}{<help>} | |
\def\sclx@error#1#2{% | |
\InfWarErr@GenericError | |
{\space\@spaces\@spaces\@spaces\@spaces}% | |
{\sclxFmtName\space Error: #1\sclx@error@a}% | |
{\empty\sclx@cute@oops\sclx@error@b}% | |
{#2}% | |
} | |
\def\sclx@error@a#1\empty{.^^J} | |
\def\sclx@error@b#1...{^^J\sclx@shrieks} | |
%% \sclx@fatal@error{<message>} | |
\def\sclx@fatal@error#1{% | |
\sclx@error{#1}% | |
{This is fatal error. Process is aborted.}% | |
\sclx@process@okfalse | |
} | |
%% \sclx@panic{<message>} | |
\def\sclx@panic#1{% | |
\sclx@error{#1}% | |
{This is fatal error. The current job is aborted.}% | |
\sclx@org@end | |
} | |
%% \sclx@warning{<message>} | |
\def\sclx@warning#1{% | |
\InfWarErr@GenericWarning | |
{\space\@spaces\@spaces\@spaces\@spaces}% | |
{\sclxFmtName\space Warning: #1}% | |
} | |
%% \sclx@warning@no@line{<message>} | |
\def\sclx@warning@no@line#1{% | |
\sclx@warning{#1\@gobble}% | |
} | |
%% \sclx@info{<message>} | |
\def\sclx@info#1{% | |
\InfWarErr@GenericInfo | |
{\space\space\@spaces\@spaces\@spaces}% | |
{\sclxFmtName\space Info: #1}% | |
} | |
%% \sclx@info@no@line{<message>} | |
\def\sclx@info@no@line#1{% | |
\sclx@info{#1\@gobble}% | |
} | |
%--------------------------------------- driver settings | |
%% driver constants | |
\chardef\sclx@driver@@unknown=0 | |
\chardef\sclx@driver@@dvips=1 | |
\chardef\sclx@driver@@dvipdfmx=2 | |
\chardef\sclx@driver@@xetex=3 | |
\chardef\sclx@driver@@pdftex=4 | |
\chardef\sclx@driver@@luatex=5 | |
%% \sclx@driver@name{<driver>} | |
\def\sclx@driver@name#1{% | |
\ifcase#1unknown% | |
\or dvips% | |
\or dvipdfmx% | |
\or xetex% | |
\or pdftex% | |
\or luatex% | |
\fi | |
} | |
%% \sclx@dvidriver@list | |
\def\sclx@dvidriver@list{% | |
\do{dvips}% | |
\do{xdvi}% | |
\do{dviout}% | |
\do{dvipdfmx}% | |
\do{dvipdfm}% | |
} | |
%% DVI-driver constants | |
\chardef\sclx@dvidriver@@dvips=\sclx@driver@@dvips | |
\chardef\sclx@dvidriver@@xdvi=\sclx@driver@@dvips | |
\chardef\sclx@dvidriver@@dviout=\sclx@driver@@dvips | |
\chardef\sclx@dvidriver@@dvipdfmx=\sclx@driver@@dvipdfmx | |
\chardef\sclx@dvidriver@@dvipdfm=\sclx@driver@@dvipdfmx | |
%% \sclx@dvidriver@default | |
\def\sclx@dvidriver@default{dvips} | |
%% \sclx@set@papersize | |
\let\sclx@set@papersize\relax | |
%% \sclx@set@papersize@inner | |
\let\sclx@set@papersize@inner\relax | |
%% check engine types | |
% Here \sclx@driver is (tentatively) set to \sclx@driver@@dvips | |
% when the engine is in normal DVI mode. | |
\sclx@check@primitive\eTeXversion\ifsclx@ok\else | |
% e-TeX is required (because TikZ needs it) | |
\sclx@fatal@error | |
{The TeX engine in use is not supported} | |
\sclx@exit\fi% | |
%---- Now e-TeX features can be used freely. | |
\let\sclx@driver\sclx@driver@@unknown | |
\ifpdf % in PDF-mode | |
\let\sclx@driver\sclx@driver@@pdftex | |
\ifluatex | |
\let\sclx@driver\sclx@driver@@luatex | |
\fi | |
\fi | |
\ifnum\sclx@driver=\sclx@driver@@unknown % not in PDF-mode | |
\let\sclx@driver\sclx@driver@@dvips | |
\sclx@check@primitive\XeTeXversion\ifsclx@ok | |
\let\sclx@driver\sclx@driver@@xetex | |
\fi | |
\fi | |
% check for unsupported engines | |
\sclx@check@primitive\VTeXversion\ifsclx@ok | |
\let\sclx@driver\sclx@driver@@unknown | |
\fi | |
\sclx@check@primitive\HINTversion\ifsclx@ok | |
\let\sclx@driver\sclx@driver@@unknown | |
\fi | |
\sclx@debug{check engine: type=\the\sclx@driver} | |
\ifnum\sclx@driver=\sclx@driver@@unknown | |
\sclx@fatal@error | |
{The TeX engine in use is not supported}% | |
\sclx@exit\fi% | |
%%<+> \sclxSetupDriver | |
\def\sclxSetupDriver{% | |
\global\let\sclxSetupDriver\relax | |
% re-set \sclx@driver according to \sclxDVIDriver | |
\sclx@process@oktrue | |
\if \ifnum\sclx@driver=\sclx@driver@@dvips F% | |
\else\ifx\sclxDVIDriver\relax F% | |
\else T\fi\fi T% | |
\sclx@fatal@error | |
{A driver option is used on the wrong engine:\MessageBreak | |
\space\space\sclxDVIDriver}% | |
\let\sclxDVIDriver\relax | |
\fi | |
\ifsclx@process@ok \ifnum\sclx@driver=\sclx@driver@@dvips | |
\ifx\sclxDVIDriver\relax | |
\let\sclxDVIDriver\sclx@dvidriver@default | |
\fi | |
\lettocs\sclx@tmpa{sclx@dvidriver@@\sclxDVIDriver}% | |
\ifdefined\sclx@tmpa | |
\let\sclx@driver\sclx@tmpa | |
\else % unknown name | |
\sclx@fatal@error | |
{An unknown driver name is given:\MessageBreak | |
\space\space\sclxDVIDriver}% | |
\fi | |
\fi\fi | |
\ifsclx@process@ok | |
\sclx@debug{driver: \sclx@driver@name\sclx@driver}% | |
% load TikZ | |
\edef\pgfsysdriver{pgfsys-\sclx@driver@name\sclx@driver.def}% | |
\sclx@suppress@newwrite | |
\input tikz.tex\relax | |
\sclx@unsuppress@newwrite | |
% enable papersize setter | |
\ifdefined\pdfpagewidth \ifdefined\pdfpageheight | |
\def\sclx@set@papersize{% | |
\pdfpagewidth=\sclxPaperWidth | |
\pdfpageheight=\sclxPaperHeight | |
}% | |
\fi\fi | |
\ifdefined\pagewidth \ifdefined\pageheight | |
\def\sclx@set@papersize{% | |
\pagewidth=\sclxPaperWidth | |
\pageheight=\sclxPaperHeight | |
}% | |
\fi\fi | |
\unless\ifx\sclxDVIDriver\relax | |
\def\sclx@set@papersize@inner{% | |
\special{papersize=\the\sclxPaperWidth,\the\sclxPaperHeight}% | |
}% | |
\fi | |
\fi | |
} | |
%--------------------------------------- general (e-TeX) | |
%% packages | |
\input texapi | |
%% \sclx@provide{<definer>}\CS | |
% Defines a stuff only when it is undefined. | |
\def\sclx@provide#1#2{% | |
\ifcommand#2{#1\sclx@next}{#1#2}% | |
} | |
%--------------------------------------- generate document | |
%% parameters | |
\def\sclxMinPaperEdge{32mm} | |
\def\sclxMinBodyEdge{60mm} | |
\def\sclxMaxMargin{20mm} | |
\def\sclxColumnRuleWidth{1pt} | |
\def\sclxColumnRuleColor{black!40} | |
\def\sclxEssentialRatio{0.85} | |
%% variables | |
\newdimen\sclx@col@width | |
\newdimen\sclx@col@height | |
\newdimen\sclx@hmargin | |
\newdimen\sclx@vmargin | |
\newdimen\sclx@ess@size | |
\let\sclx@color@count\relax | |
%\[sclx@color/<idx>] | |
%% errors | |
\def\sclx@error@too@small#1{% | |
\sclx@fatal@error | |
{The #1 is too small}% | |
} | |
\def\sclx@error@no@colors{% | |
\sclx@fatal@error | |
{No color is specified}% | |
} | |
%%<+> \sclxWriteDocument | |
\def\sclxWriteDocument{% | |
\sclxSetupDriver | |
\ifsclx@process@ok % if not ok then do nothing | |
\sclx@set@layout | |
\fi | |
\ifsclx@process@ok | |
\begingroup | |
\sclx@set@papersize | |
\shipout\vbox{% | |
\sclx@set@papersize@inner | |
\vskip-1in | |
\moveleft1in\vbox{% | |
\sclx@essential@page | |
}% | |
}% | |
\endgroup | |
\fi | |
} | |
%% \sclx@set@layout | |
\def\sclx@set@layout{% | |
\ifnum\sclxColumnCount<1 | |
\sclxColumnCount=1 | |
\else\ifnum\sclxColumnCount>8 | |
\sclxColumnCount=8 | |
\fi\fi | |
\ifdim\sclxPaperWidth<\sclxMinPaperEdge\relax | |
\sclx@error@too@small{paper width}% | |
\sclxPaperWidth=\sclxMinPaperEdge\relax | |
\fi | |
\ifdim\sclxPaperHeight<\sclxMinPaperEdge\relax | |
\sclx@error@too@small{paper height}% | |
\sclxPaperHeight=\sclxMinPaperEdge\relax | |
\fi | |
\sclx@set@layout@a\sclxPaperWidth\sclx@col@width\sclx@hmargin{width}% | |
\divide\sclx@col@width\sclxColumnCount | |
\sclx@set@layout@a\sclxPaperHeight\sclx@col@height\sclx@vmargin{height}% | |
\ifdim\sclx@col@width>\sclx@col@height | |
\sclx@ess@size=\sclxEssentialRatio\sclx@col@height | |
\else | |
\sclx@ess@size=\sclxEssentialRatio\sclx@col@width | |
\fi | |
\sclx@debug{column-width: \the\sclx@col@width}% | |
\sclx@debug{essential-size: \the\sclx@ess@size}% | |
% colors | |
\sclx@cnta=0 | |
\edef\sclx@tmpa{\sclxMufflerColor,}% | |
\passexpanded\sclx@set@layout@b\sclx@tmpa | |
\ifnum\sclx@cnta=0 | |
\sclx@error@no@colors | |
\fi | |
\chardef\sclx@color@count\sclx@cnta | |
\sclx@debug{color-count: \the\sclx@color@count}% | |
} | |
\def\sclx@set@layout@a#1#2#3#4{% | |
\ifdim#1<\sclxMinBodyEdge\relax | |
#3=0pt #2=#1\relax | |
\else | |
#2=\sclxMinBodyEdge #3=.5\dimexpr#1-#2\relax | |
\ifdim#3>\sclxMaxMargin\relax | |
#3=\sclxMaxMargin #2=\dimexpr#1-2#3\relax | |
\fi | |
\fi | |
\sclx@debug{#4: paper=\the#1; body=\the#2; margin=\the#3}% | |
} | |
\newfor\sclx@set@layout@b#1,{% | |
\ltx@ifblank{#1}{}{%else | |
\edefcs{sclx@color/\the\sclx@cnta}{\trim{#1}}% | |
\advance\sclx@cnta1 | |
}% | |
\sclx@cond\ifnum\sclxColumnCount=\sclx@cnta\fi{\breakfor{}}% | |
} | |
%% \sclx@essential@page | |
\def\sclx@essential@page{% | |
\vskip\sclx@vmargin | |
\hbox{\hskip\sclx@hmargin | |
\sclx@cnta=0 | |
\count@=\sclxColumnCount\relax | |
\loop\ifnum\count@>0 | |
\begingroup | |
\passexpandedcs\sclx@essential@box{sclx@color/\the\sclx@cnta}% | |
\endgroup | |
\advance\count@-1 | |
\ifnum\count@>0 | |
\dimen@\sclxColumnRuleWidth\relax | |
\kern-.5\dimen@ | |
\begingroup | |
\color{\sclxColumnRuleColor}% | |
\vrule width\dimen@ height\sclx@col@height depth\z@ | |
\endgroup | |
\kern-.5\dimen@ | |
\fi | |
\advance\sclx@cnta1 | |
\ifnum\sclx@color@count=\sclx@cnta \sclx@cnta=0 \fi | |
\repeat | |
}% | |
} | |
%% \sclx@essential@box{<color>} | |
\def\sclx@essential@box#1{% | |
\sclx@debug{essential: muffler=#1}% | |
\vbox to \sclx@col@height{% | |
\vskip 0pt plus 2fil\relax | |
\hbox to \sclx@col@width{% | |
\hfil \sclxDrawEssential{\sclx@ess@size}{#1}\hfil | |
}% | |
\vskip 0pt plus 3fil\relax | |
}% | |
} | |
%--------------------------------------- PGF hacks | |
%% \sclx@suppress@newwrite | |
\def\sclx@suppress@newwrite{% | |
\letcstocs{sclx@saved@newwrite}{newwrite}% | |
\letcstocs{newwrite}{sclx@noop@newwrite}% | |
\letcstocs{sclx@saved@openout}{openout}% | |
\letcstocs{openout}{sclx@noop@openout}% | |
} | |
%% \sclx@unsuppress@newwrite | |
\def\sclx@unsuppress@newwrite{% | |
\letcstocs{newwrite}{sclx@saved@newwrite}% | |
\letcstocs{openout}{sclx@saved@openout}% | |
} | |
%% \sclx@noop@newwrite | |
\def\sclx@noop@newwrite#1{% | |
\let#1\ltx@minusone | |
} | |
%% \sclx@noop@openout | |
% MB. A delimiting space is assumed. | |
\def\sclx@noop@openout#1 {} | |
%--------------------------------------- the essential one | |
%%<+> \sclxDrawEssential{<size>}{<muffler-color>} | |
\def\sclxDrawEssential#1#2{% | |
\tikzpicture[x=#1,y=#1,line width=#1*0.013888,% | |
line join=round,line cap=round] | |
\useasboundingbox (0,0) rectangle (1,1); | |
\draw % body | |
(0.5,0.72) .. controls (0.64,0.72) and (0.76,0.65) .. | |
(0.76,0.55) .. controls (0.76,0.51) and (0.72,0.47) .. | |
(0.67,0.44) .. controls (0.79,0.41) and (0.84,0.32) .. | |
(0.84,0.25) .. controls (0.84,0.13) and (0.75,0.08) .. | |
(0.68,0.08) -- | |
(0.32,0.08) .. controls (0.25,0.08) and (0.16,0.13) .. | |
(0.16,0.25) .. controls (0.16,0.32) and (0.21,0.41) .. | |
(0.33,0.44) .. controls (0.28,0.47) and (0.24,0.51) .. | |
(0.24,0.55) .. controls (0.24,0.65) and (0.36,0.72) .. | |
(0.5,0.72) -- | |
cycle; | |
% eyes | |
\fill (0.40,0.56) circle (0.02 and 0.03); | |
\fill (0.60,0.56) circle (0.02 and 0.03); | |
% mouth | |
\draw (0.40,0.48) .. controls (0.45,0.45) and (0.55,0.45) .. (0.60,0.48); | |
\filldraw % hat | |
(0.58,0.90) -- | |
(0.77,0.81) -- | |
(0.74,0.61) .. controls (0.66,0.60) and (0.50,0.66) .. | |
(0.46,0.72) -- | |
(0.58,0.90) -- | |
cycle; | |
\filldraw % right arm | |
(0.20,0.31) .. controls (0.19,0.33) and (0.14,0.41) .. | |
(0.13,0.42) .. controls (0.12,0.43) and (0.10,0.43) .. | |
(0.07,0.44) .. controls (0.04,0.46) and (0.06,0.46) .. | |
(0.08,0.46) .. controls (0.09,0.46) and (0.11,0.44) .. | |
(0.12,0.44) .. controls (0.14,0.46) and (0.14,0.47) .. | |
(0.15,0.49) .. controls (0.16,0.51) and (0.16,0.49) .. | |
(0.16,0.48) .. controls (0.16,0.46) and (0.14,0.44) .. | |
(0.15,0.43) .. controls (0.16,0.42) and (0.21,0.35) .. | |
(0.22,0.33) .. controls (0.23,0.31) and (0.21,0.30) .. | |
(0.20,0.31) -- | |
cycle; | |
\filldraw % left arm | |
(0.80,0.31) .. controls (0.81,0.33) and (0.86,0.41) .. | |
(0.87,0.42) .. controls (0.88,0.43) and (0.90,0.43) .. | |
(0.93,0.44) .. controls (0.96,0.46) and (0.94,0.46) .. | |
(0.92,0.46) .. controls (0.91,0.46) and (0.89,0.44) .. | |
(0.88,0.44) .. controls (0.86,0.46) and (0.86,0.47) .. | |
(0.85,0.49) .. controls (0.84,0.51) and (0.84,0.49) .. | |
(0.84,0.48) .. controls (0.84,0.46) and (0.86,0.44) .. | |
(0.85,0.43) .. controls (0.84,0.42) and (0.79,0.35) .. | |
(0.78,0.33) .. controls (0.77,0.31) and (0.79,0.30) .. | |
(0.80,0.31) -- | |
cycle; | |
\filldraw[#2] % muffler | |
(0.27,0.48) .. controls (0.42,0.38) and (0.58,0.38) .. | |
(0.73,0.48) .. controls (0.75,0.46) and (0.76,0.44) .. | |
(0.77,0.41) .. controls (0.77,0.39) and (0.75,0.37) .. | |
(0.73,0.36) .. controls (0.74,0.33) and (0.74,0.31) .. | |
(0.76,0.26) .. controls (0.75,0.25) and (0.72,0.24) .. | |
(0.66,0.23) .. controls (0.66,0.27) and (0.65,0.30) .. | |
(0.63,0.34) .. controls (0.42,0.30) and (0.32,0.35) .. | |
(0.24,0.41) .. controls (0.25,0.45) and (0.26,0.47) .. | |
(0.27,0.48) -- | |
cycle; | |
% buttons | |
\filldraw (0.50,0.16) circle (0.03); | |
\filldraw (0.50,0.26) circle (0.03); | |
% snow | |
\draw (0.07,0.28) circle (0.04); | |
\draw (0.13,0.55) circle (0.04); | |
\draw (0.08,0.68) circle (0.04); | |
\draw (0.23,0.76) circle (0.04); | |
\draw (0.42,0.89) circle (0.04); | |
\draw (0.74,0.89) circle (0.04); | |
\draw (0.88,0.73) circle (0.04); | |
\draw (0.92,0.53) circle (0.04); | |
\draw (0.94,0.23) circle (0.04); | |
\endtikzpicture | |
} | |
%--------------------------------------- bits of LaTeX | |
%% variables | |
%[sclx@env/<env>] : (pseudo-)environment starter | |
%% errors | |
\def\sclx@warn@ignore@cmd#1{% | |
\sclx@warning | |
{Command '\string#1' is ignored,\MessageBreak | |
since it is not *essential*}% | |
} | |
\def\sclx@warn@ignore@env#1{% | |
\sclx@warning | |
{Environment '#1' is ignored,\MessageBreak | |
since it is not *essential*}% | |
} | |
%% \sclx@check@star{<cont>} | |
% Sets switch sclx@ok. | |
\def\sclx@check@star#1{% | |
\def\sclx@next{#1}% | |
\sclx@okfalse | |
\ltx@ifnextchar*{\sclx@check@star@a}{\sclx@next}% | |
} | |
\def\sclx@check@star@a*{% | |
\sclx@oktrue | |
\sclx@next | |
} | |
%% \sclx@gobble@opt{<cont>} | |
\def\sclx@gobble@opt#1{% | |
\def\sclx@next{#1}% | |
\ltx@ifnextchar[{\sclx@gobble@opt@a}{\sclx@gobble@opt@a[]}% | |
} | |
\def\sclx@gobble@opt@a[#1]{% | |
\sclx@next | |
} | |
%% \begin{<env>} | |
\def\begin#1{% | |
\lettocs\sclx@tmpa{sclx@env/#1}% | |
\ifcommand\sclx@tmpa{% | |
\sclx@tmpa | |
}{%else | |
\sclx@warn@ignore@env{#1}% | |
}% | |
} | |
%% \end{<env>} | |
\def\end#1{% | |
% no check ;) | |
} | |
%% \DocumentMetadata{<metadata>,...} | |
\sclx@provide{\long\def}\DocumentMetadata#1{% | |
\def\sclx@metadata{#1}% | |
\sclx@process@metadata | |
} | |
%% \documentclass[<option>,...]{<class>}[<version>] | |
\sclx@provide\def\documentclass{% | |
\ltx@ifnextchar[{\sclx@documentclass@a}{\sclx@documentclass@a[]}% | |
} | |
\def\sclx@documentclass@a[#1]#2{% | |
\edef\sclx@option@list{#1}% | |
\edef\sclx@class@name{#2}% | |
\sclx@process@class | |
\sclx@leave@latexish | |
\sclxWriteDocument | |
\sclx@org@end % quit, so <version> need not be read | |
} | |
%% \RequirePackage[<option>,...]{<package>}[<version>] | |
\sclx@provide\def\RequirePackage{% | |
\sclx@warn@ignore@cmd\RequirePackage | |
\sclx@gobble@opt{\sclx@loadfile}% | |
} | |
\def\sclx@loadfile#1{% | |
\sclx@gobble@opt{}% | |
} | |
%% environment 'filecontents(*)' | |
\defcs{sclx@env/filecontents}{% | |
\sclx@filecontents{filecontents}% | |
} | |
\defcs{sclx@env/filecontents*}{% | |
\sclx@filecontents{filecontents*}% | |
} | |
\def\sclx@filecontents#1{% | |
\sclx@warn@ignore@env{#1}% | |
\begingroup | |
\sclx@filecontents@a{#1}% | |
\catcode13=12 | |
\def\do##1{\catcode`##1=12 }\dospecials | |
\sclx@next | |
} | |
\setcatcodes{\\\{\}\^^M=12,\|=0,\[=1,\]=2}% | |
|def|sclx@filecontents@a#1[% | |
|def|sclx@next##1\end{#1}##2^^M[|endgroup]% | |
]% | |
|restorecatcodes% | |
%% environment 'document' | |
\defcs{sclx@env/document}{% | |
\sclx@panic | |
{The font size command \string\normalsize\space | |
is not defined:\MessageBreak | |
there is probably something wrong with the class file}% | |
} | |
%% \newcommand[*]\CS[<n>]{<code>} | |
%% \providecommand[*]\CS[<n>]{<code>} | |
% Ignored. | |
\sclx@provide\def\newcommand{% | |
\sclx@warn@ignore@cmd\newcommand | |
\sclx@check@star{\sclx@new@command}% | |
} | |
\sclx@provide\def\providecommand{% | |
\sclx@warn@ignore@cmd\newcommand | |
\sclx@check@star{\sclx@new@command}% | |
} | |
\def\sclx@new@command#1{% | |
\sclx@gobble@opt{\ltx@gobble}% | |
} | |
%% \renewcommand[*]\CS[<n>]{<code>} | |
% Redefines \CS only when it is defined and n is zero; | |
% otherwise does nothing. | |
\sclx@provide\def\renewcommand{% | |
\sclx@check@star{\sclx@renewcommand@a}% | |
} | |
\def\sclx@renewcommand@a#1{% | |
\ltx@ifnextchar[{\sclx@renewcommand@b#1}{\sclx@renewcommand@b#1[0]}% | |
} | |
\def\sclx@renewcommand@b#1[#2]{% | |
\sclx@cond\ifnum#2=0 \fi{% | |
\ifcommand#1{% | |
\ifsclx@ok \long \fi \def#1% | |
}{%else | |
\ltx@gobble | |
}% | |
}{% \renewcommand with arguments are deemed inessential | |
\sclx@warn@ignore@cmd\newcommand | |
\ltx@gobble | |
}% | |
} | |
%% \setlength{<length-cmd>}{<length>} | |
% Assigns only when the length command is defined. | |
\sclx@provide\def\setlength#1{% | |
\sclx@setlength@a#1\@undefined\sclx@end{#1}% | |
} | |
\def\sclx@setlength@a#1#2\sclx@end#3#4{% | |
\ifdefined#1% check the head of <length-cmd> | |
#3 #4\relax % assignment | |
\fi | |
} | |
%% \setcounter{<counter>} | |
% Assigns only when the counter is defined. | |
\sclx@provide\def\setcounter#1#2{% | |
\ifcsname c@#1\endcsname | |
\global\csname c@#1\endcsname#2\relax | |
\fi | |
} | |
%% \stop | |
\sclx@provide\def\stop{% | |
\sclx@leave@latexish | |
\usecs{bye}% | |
} | |
%% tracing commands | |
% NB. They are overwritten. | |
\def\showoverfull{% | |
\tracingonline\@ne | |
} | |
\def\loggingoutput{% | |
\tracingoutput\@ne | |
\showboxbreadth\maxdimen | |
\showboxdepth\maxdimen | |
\errorstopmode | |
} | |
\def\showoutput{% | |
\loggingoutput | |
\showoverfull | |
} | |
\def\loggingall{% | |
\tracingstats\tw@ | |
\tracingpages\@ne | |
\tracinglostchars\@ne | |
\tracingparagraphs\@ne | |
\errorcontextlines\maxdimen | |
\loggingoutput | |
\tracingmacros\tw@ | |
\tracingcommands\tw@ | |
\tracingrestores\@ne | |
} | |
\def\tracingall{% | |
\showoverfull | |
\loggingall | |
} | |
\def\tracingnone{% | |
\tracingonline\z@ | |
\tracingcommands\z@ | |
\showboxdepth\m@ne | |
\showboxbreadth\m@ne | |
\tracingoutput\z@ | |
\errorcontextlines\m@ne | |
\tracingrestores\z@ | |
\tracingparagraphs\z@ | |
\tracingmacros\z@ | |
\tracinglostchars\@ne | |
\tracingpages\z@ | |
\tracingstats\z@ | |
} | |
\def\hideoutput{% | |
\tracingoutput\z@ | |
\showboxbreadth\m@ne | |
\showboxdepth\m@ne | |
\tracingonline\m@ne | |
} | |
\tracingnone | |
\tracingstats=1 % as LaTeX does... | |
%% counter 'errorcontextlines' | |
\let\c@errorcontextlines\errorcontextlines | |
%% miscellanea | |
\sclx@provide\def\makeatletter{\catcode`\@11\relax} | |
\sclx@provide\def\makeatother{\catcode`\@12\relax} | |
\sclx@provide\def\listfiles{\sclx@warn@ignore@cmd\listfiles} | |
\sclx@provide\def\nofiles{\sclx@warn@ignore@cmd\nofiles} | |
%--------------------------------------- metadata processor | |
%% \sclx@process@metadata | |
\def\sclx@process@metadata{% | |
\kv@set@family@handler{metadata}{% | |
% ignore all unknown keys | |
}% | |
\passexpanded{\kvsetkeys{metadata}}{\sclx@metadata}% | |
} | |
%% 'backend' | |
\kv@define@key{metadata}{backend}{% | |
\ltx@ifblank{#1}{}{%else | |
\edef\sclxDVIDriver{#1}% | |
\sclx@debug{metadata: backend=\sclxDVIDriver}% | |
}% | |
} | |
%% 'muffler' (NICE!) | |
\kv@define@key{metadata}{muffler}{% | |
\edef\sclxMufflerColor{#1}% | |
\sclx@debug{metadata: muffler=\sclxMufflerColor}% | |
} | |
%% 'columns' | |
\kv@define@key{metadata}{columns}{% | |
\sclxColumnCount=#1\relax | |
\sclx@meta@column@counttrue | |
\sclx@debug{metadata: columns=\the\sclxColumnCount}% | |
} | |
%--------------------------------------- class processors | |
%% variables | |
\let\sclx@bsize@name\relax | |
\chardef\sclx@iso@bsize=0 | |
%\[sclx@cproc/<class>] : class processors | |
%% \sclx@process@class | |
\def\sclx@process@class{% | |
\lettocs\sclx@next{sclx@cproc/\sclx@class@name}% | |
\unless\ifdefined\sclx@next | |
\lettocs\sclx@next{sclx@cproc/*default*}% | |
\fi | |
\sclx@typeout{Document Class: \sclx@class@name}% | |
\sclx@next | |
} | |
%% \sclx@declare@class@processor{<class>}{<code>} | |
\def\sclx@declare@class@processor#1{% | |
\defcs{sclx@cproc/#1}% | |
} | |
%% \sclx@copy@class@processor{<class1>}{<class2>} | |
\def\sclx@copy@class@processor#1#2{% | |
\letcstocs{sclx@cproc/#1}{sclx@cproc/#2}% | |
} | |
%% \sclx@define@key{<key>}[<default>]{<code>} | |
\def\sclx@define@key#1{% | |
\sclx@debug{class key declared: #1}% | |
\kv@define@key{class}{#1}% | |
} | |
\kv@set@family@handler{class}{% | |
% ignore all unknown keys | |
}% | |
%% \sclx@define@dumbkey{<key>}{<code>} | |
\def\sclx@define@dumbkey#1#2{% | |
\sclx@define@key{#1}[\sclx@end]{% | |
\ifx\sclx@end##1#2\fi% process if value is absent | |
}% otherwise ignore | |
} | |
%% \sclx@define@paperkey{<key>}{<ps-name>} | |
\def\sclx@define@paperkey#1#2{% | |
\sclx@define@dumbkey{#1}{\usecs{sclx@ps/#2}}% | |
} | |
%% \sclx@define@kosokey{<key>}{<true>}{<false>} | |
\chardef\sclx@kosovalue@@true=1 | |
\chardef\sclx@kosovalue@@on=1 | |
\chardef\sclx@kosovalue@@yes=1 | |
\chardef\sclx@kosovalue@@false=0 | |
\chardef\sclx@kosovalue@@off=0 | |
\chardef\sclx@kosovalue@@no=0 | |
\def\sclx@define@kosokey#1#2#3{% | |
\sclx@define@key{#1}[true]{% | |
\lettocs\sclx@tmpa{sclx@kosovalue@@##1}% | |
\ifcase\ifdefined\sclx@tmpa\sclx@tmpa\else\ltx@minusone\fi | |
#3% false | |
\or #2% true | |
\fi | |
}% | |
} | |
%% \sclx@execute@keys{<key>=<value>,...} | |
\def\sclx@execute@keys{% | |
\kvsetkeys{class}% | |
} | |
%% \sclx@process@keys | |
\def\sclx@process@keys{% | |
\passexpanded\sclx@execute@keys{\sclx@option@list}% | |
\unless\ifx\sclx@bsize@name\relax | |
\sclx@adjust@bsize | |
\fi | |
\ifsclx@landscape | |
\sclx@debug{landscape applied}% | |
\sclx@swap@paper@size@edges | |
\fi | |
} | |
%% \sclx@define@landscape@keys | |
\def\sclx@define@landscape@keys{% | |
\sclx@define@dumbkey{landscape}{\sclx@landscapetrue}% | |
\sclx@define@dumbkey{portrait}{\sclx@landscapefalse}% | |
} | |
%% \sclx@define@column@keys | |
\def\sclx@define@column@keys{% | |
\sclx@define@dumbkey{onecolumn}{\sclx@set@column@count{1}}% | |
\sclx@define@dumbkey{twocolumn}{\sclx@set@column@count{2}}% | |
} | |
%% \sclx@define@paper@keys@std | |
\def\sclx@define@paper@keys@std{% | |
\def\do##1{\sclx@define@paperkey{##1paper}{##1}}% | |
\do{a3}\do{a4}\do{a5}\do{a6}\do{b4}\do{b5}\do{b6}% | |
\do{letter}\do{legal}\do{executive}% | |
} | |
%% \sclx@define@paper@keys@ja | |
\def\sclx@define@paper@keys@ja{% | |
\def\do##1{\sclx@define@paperkey{##1paper}{##1}}% | |
\do{a3}\do{a4}\do{a5}\do{a6}\do{letter}\do{legal}\do{executive}% | |
\def\do##1{\sclx@define@paperkey{##1}{##1}}% | |
\do{b4j}\do{b5j}\do{a4var}\do{b5var}% | |
\def\do##1{\sclx@define@paperkey{##1paper}{##1j}}% | |
\do{b4}\do{b5}\do{b6}% | |
\def\do##1{\sclx@define@paperkey{##1j}{##1}}% | |
\do{a4}\do{a5}% | |
} | |
%% \sclx@define@driver@keys | |
\def\sclx@define@driver@keys{% | |
\def\do##1{\sclx@define@dumbkey{##1}{\def\sclxDVIDriver{##1}}}% | |
\sclx@dvidriver@list | |
} | |
%% \sclx@set@paper@size{<width>}{<height>} | |
\def\sclx@set@paper@size#1#2{% | |
\sclx@debug{papersize set: width=#1, height=#2}% | |
\sclxPaperWidth=#1\relax | |
\sclxPaperHeight=#2\relax | |
\let\sclx@paper@size@name\relax | |
}% | |
%% \sclx@swap@paper@size@edges | |
\def\sclx@swap@paper@size@edges{% | |
\dimen@=\sclxPaperWidth | |
\sclxPaperWidth=\sclxPaperHeight | |
\sclxPaperHeight=\dimen@ | |
} | |
%% \sclx@adjust@bsize | |
\def\sclx@adjust@bsize{% | |
\sclx@debug{adjust bsize: \number\sclx@iso@bsize}% | |
\ifnum\sclx@iso@bsize=0 | |
\usecs{sclx@ps/\sclx@bsize@name j}% | |
\fi | |
} | |
%% \sclx@set@column@count{<count>} | |
\def\sclx@set@column@count#1{% | |
\unless\ifsclx@meta@column@count | |
\sclxColumnCount=#1\relax | |
\fi | |
}% | |
%% \sclx@if@two@args{<arg>}{<true>}{<false>} | |
\def\sclx@if@two@args#1{% | |
\sclx@if@two@args@a#1{\sclx@mk}{}\sclx@end | |
} | |
\def\sclx@if@two@args@a#1#{% | |
\ltx@ifempty{#1}{\sclx@if@two@args@b}{\sclx@if@two@args@c}% | |
} | |
\def\sclx@if@two@args@b#1#2#3#4\sclx@end{% | |
\sclx@cond\ifx\sclx@mk#3\fi | |
} | |
\def\sclx@if@two@args@c#1\sclx@end{% | |
\ltx@secondoftwo | |
} | |
%% the default class | |
\sclx@declare@class@processor{*default*}{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@std | |
\sclx@define@landscape@keys | |
\sclx@define@column@keys | |
\sclx@execute@keys{onecolumn,a4paper,portrait}% | |
\sclx@process@keys | |
} | |
%% classes for Japanese documents | |
\sclx@declare@class@processor{jsarticle}{% | |
\sclx@define@dumbkey{slide}{\sclx@landscapetrue}% | |
\sclx@process@ja@classes | |
} | |
\sclx@declare@class@processor{jsreport}{% | |
\sclx@process@ja@classes | |
} | |
\sclx@declare@class@processor{jsbook}{% | |
\sclx@process@ja@classes | |
} | |
\def\sclx@process@ja@classes{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@ja | |
\sclx@define@landscape@keys | |
\sclx@define@column@keys | |
\sclx@execute@keys{onecolumn,a4paper,portrait}% | |
\sclx@process@keys | |
} | |
\sclx@copy@class@processor{ltjsarticle}{jsarticle} | |
\sclx@copy@class@processor{ltjsreport}{jsreport} | |
\sclx@copy@class@processor{ltjsbook}{jsbook} | |
\sclx@copy@class@processor{jarticle}{jsarticle} | |
\sclx@copy@class@processor{jreport}{jsreport} | |
\sclx@copy@class@processor{jbook}{jsbook} | |
\sclx@copy@class@processor{ltjarticle}{jsarticle} | |
\sclx@copy@class@processor{ltjreport}{jsreport} | |
\sclx@copy@class@processor{ltjbook}{jsbook} | |
% maybe tate classes should be supported more appropriately... | |
\sclx@copy@class@processor{tarticle}{jsarticle} | |
\sclx@copy@class@processor{treport}{jsreport} | |
\sclx@copy@class@processor{tbook}{jsbook} | |
\sclx@copy@class@processor{lttarticle}{jsarticle} | |
\sclx@copy@class@processor{lttreport}{jsreport} | |
\sclx@copy@class@processor{lttbook}{jsbook} | |
%% class 'jlreq' | |
\sclx@declare@class@processor{jlreq}{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@jlreq | |
\sclx@define@landscape@keys | |
\sclx@define@column@keys | |
\sclx@execute@keys{onecolumn,a4paper,portrait}% | |
\sclx@process@keys | |
} | |
\def\sclx@define@paper@keys@jlreq{% | |
\def\do##1{\sclx@define@paperkey{##1paper}{##1}}% | |
\do{a3}\do{a4}\do{a5}\do{a6}% | |
\do{b4}\do{b5}\do{b6}% | |
\do{letter}\do{legal}\do{executive}% | |
% 'paper=<size>' | |
\sclx@define@key{paper}{% | |
\ifcs{sclx@psopt/##1}{% paper size name | |
\usecs{sclx@ps/\usecs{sclx@psopt/##1}}% | |
}{\ifcontains{,}{##1}{% values | |
\splitstringat{,}{##1}{\sclx@set@paper@size}% | |
}{%else | |
\@ClassError\sclx@class@name | |
{The paper ##1 is unknown}% | |
{\@ehc}% | |
}}% | |
}% | |
\def\sclx@next##1{\defcs{sclx@psopt/##1}}% | |
\def\do##1##2##3##4##5{% | |
\if\if##1AT\else\if##1BT\else\if##1CT\else F\fi\fi\fi T%[A/B/C] | |
\sclx@next{##2paper}{##2}% | |
\sclx@next{##2}{##2}% | |
\uppercase{\sclx@next{##2}}{##2}% | |
\else\if\if##1JT\else\if##1VT\else F\fi\fi T%[J/V] | |
\sclx@next{##2}{##2}% | |
\else\if##1U%[U] | |
\sclx@next{##2paper}{##2}% | |
\sclx@next{##2}{##2}% | |
\fi\fi\fi | |
}% | |
\sclx@paper@size@list | |
} | |
%% classes in BXjscls | |
\sclx@declare@class@processor{bxjsarticle}{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@bxjs | |
\sclx@define@landscape@keys | |
\sclx@define@column@keys | |
\sclx@execute@keys{onecolumn,a4paper,portrait}% | |
\sclx@process@keys | |
} | |
\def\sclx@define@paper@keys@bxjs{% | |
\def\do##1##2##3##4##5{% | |
\if##1A%[A] | |
\sclx@define@paperkey{##2paper}{##2}% | |
\sclx@define@paperkey@bxjs{##2}{##2}% | |
\else\if##1B%[B] | |
\sclx@define@dumbkey{##2paper}{% | |
\usecs{sclx@ps/##2}% | |
\def\sclx@bsize@name{##2}% | |
}% | |
\sclx@define@paperkey@bxjs{##2}{##2}% | |
\else\if\if##1CT\else\if##1UT\else F\fi\fi T%[C/U] | |
\sclx@define@paperkey{##2paper}{##2}% | |
\else\if\if##1VT\else\if##1XT\else F\fi\fi T%[V/X] | |
\sclx@define@paperkey{##2paper}{##2}% | |
\sclx@define@paperkey{##2}{##2}% | |
\else\if##1J%[J} | |
\sclx@define@paperkey{##2}{##2}% | |
\fi\fi\fi\fi\fi | |
}% | |
\sclx@paper@size@list | |
\sclx@define@dumbkey{iso-bsize}{\chardef\sclx@iso@bsize=1 }% | |
% 'paper=<size>' | |
\sclx@define@key{paper}{% | |
\ifcontains{,}{##1}{% width,height | |
\splitstringat{,}{##1}{\sclx@set@paper@size}% | |
}{\ifcontains{*}{##1}{% width*height | |
\splitstringat{*}{##1}{\sclx@set@paper@size}% | |
}{\sclx@if@two@args{##1}{% {width}{height}% | |
\sclx@set@paper@size##1% | |
}{}}}% ignored | |
}% | |
} | |
\def\sclx@define@paperkey@bxjs#1#2{% | |
\uppercase{\def\sclx@tmpa{#1}}% | |
\sclx@define@paperkey{\sclx@tmpa paper}{#2}% | |
} | |
\sclx@copy@class@processor{bxjsreport}{bxjsarticle} | |
\sclx@copy@class@processor{bxjsbook}{bxjsarticle} | |
\sclx@copy@class@processor{bxjsslide}{bxjsarticle} | |
%% classes in KOMA-Script | |
\sclx@declare@class@processor{scrartcl}{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@koma | |
\sclx@define@column@keys@koma | |
\sclx@execute@keys{onecolumn,a4paper,portrait}% | |
\sclx@process@keys | |
} | |
\def\sclx@define@column@keys@koma{% | |
\sclx@define@kosokey{onecolumn}{\sclx@set@column@count{1}}{}% | |
\sclx@define@kosokey{twocolumn}{% | |
\sclx@set@column@count{2}% | |
}{%else | |
\sclx@set@column@count{1}% | |
}% | |
} | |
\def\sclx@define@paper@keys@koma{% | |
\def\do##1{% | |
\sclx@define@kosokey{##1paper}{\usecs{sclx@ps/##1}}{}% | |
}% | |
\do{a4}\do{a5}\do{b5}% | |
\do{letter}\do{legal}\do{executive}% | |
\sclx@define@kosokey{portrait}{\sclx@landscapefalse}{}% | |
\sclx@define@kosokey{landscape}{\sclx@landscapetrue}{}% | |
% 'paper=<size>' | |
\sclx@define@key{paper}{% | |
\ifcs{sclx@psopt/##1}{% paper size name | |
\usecs{sclx@ps/\usecs{sclx@psopt/##1}}% | |
}{\ifcs{sclx@psoptl/##1}{% landscape | |
\usecs{sclx@psoptl/##1}% | |
}{\ifcontains{:}{##1}{% width:height | |
\splitstringat{:}{##1}{\sclx@set@paper@size@koma}% | |
}{}}}% ignored | |
}% | |
\def\sclx@next##1{\defcs{sclx@psopt/##1}}% | |
\def\do##1##2##3##4##5{% | |
\if\if##1AT\else\if##1BT\else\if##1CT\else\if##1DT\else | |
F\fi\fi\fi\fi T%[A/B/C/D] | |
\sclx@next{##2}{##2}% | |
\uppercase{\sclx@next{##2}}{##2}% | |
\else\if##1U%[U] | |
\sclx@next{##2}{##2}% | |
\fi\fi | |
}% | |
\sclx@paper@size@list | |
\defcs{sclx@psoptl/portrait}{\sclx@landscapefalse}% | |
\defcs{sclx@psoptl/landscape}{\sclx@landscapetrue}% | |
\defcs{sclx@psoptl/seascape}{\sclx@landscapetrue}% | |
} | |
\def\sclx@set@paper@size@koma#1#2{% | |
\sclx@set@paper@size{#1}{#2}% | |
\ifdim\sclxPaperWidth>\sclxPaperHeight | |
\sclx@swap@paper@size@edges | |
\fi | |
} | |
\sclx@copy@class@processor{scrreprt}{scrartcl} | |
\sclx@copy@class@processor{scrbook}{scrartcl} | |
\sclx@copy@class@processor{scrlttr2}{scrartcl} | |
\sclx@copy@class@processor{scrarticle}{scrartcl} | |
\sclx@copy@class@processor{scrreport}{scrreprt} | |
\sclx@copy@class@processor{scrletter}{scrartcl} | |
%% class 'beamer' | |
\sclx@declare@class@processor{beamer}{% | |
\sclx@define@driver@keys | |
\sclx@define@paper@keys@beamer | |
\sclx@execute@keys{aspectratio=43}% | |
\sclx@process@keys | |
} | |
\def\sclx@define@paper@keys@beamer{% | |
\sclx@define@key{aspectratio}{\usecs{sclx@ar/##1}}% | |
\defcs{sclx@ar/2013}{\sclx@set@paper@size{140mm}{91mm}}% | |
\defcs{sclx@ar/1610}{\sclx@set@paper@size{160mm}{100mm}}% | |
\defcs{sclx@ar/169}{\sclx@set@paper@size{160mm}{90mm}}% | |
\defcs{sclx@ar/149}{\sclx@set@paper@size{140mm}{90mm}}% | |
\defcs{sclx@ar/141}{\sclx@set@paper@size{148.5mm}{105mm}}% | |
\defcs{sclx@ar/54}{\sclx@set@paper@size{125mm}{100mm}}% | |
\defcs{sclx@ar/43}{\sclx@set@paper@size{128mm}{96mm}}% | |
} | |
%% class 'minimal' | |
\sclx@declare@class@processor{minimal}{% | |
\kv@set@family@handler{class}{% | |
\def\sclxDVIDriver{##1}% | |
}% | |
\sclx@process@keys | |
} | |
%--------------------------------------- paper sizes | |
%% \sclx@paper@size@list | |
% List of \do{<kind>}{<name>}{<width>}{<height>}{<unit>}. | |
\def\sclx@paper@size@list{% | |
\do{A}{a0}{841}{1189}{mm}% | |
\do{A}{a1}{594}{841}{mm}% | |
\do{A}{a2}{420}{594}{mm}% | |
\do{A}{a3}{297}{420}{mm}% | |
\do{A}{a4}{210}{297}{mm}% | |
\do{A}{a5}{148}{210}{mm}% | |
\do{A}{a6}{105}{148}{mm}% | |
\do{A}{a7}{74}{105}{mm}% | |
\do{A}{a8}{52}{74}{mm}% | |
\do{A}{a9}{37}{52}{mm}% | |
\do{A}{a10}{26}{37}{mm}% | |
\do{B}{b0}{1000}{1414}{mm}% | |
\do{B}{b1}{707}{1000}{mm}% | |
\do{B}{b2}{500}{707}{mm}% | |
\do{B}{b3}{353}{500}{mm}% | |
\do{B}{b4}{250}{353}{mm}% | |
\do{B}{b5}{176}{250}{mm}% | |
\do{B}{b6}{125}{176}{mm}% | |
\do{B}{b7}{88}{125}{mm}% | |
\do{B}{b8}{62}{88}{mm}% | |
\do{B}{b9}{44}{62}{mm}% | |
\do{B}{b10}{31}{44}{mm}% | |
\do{C}{c0}{917}{1297}{mm}% | |
\do{C}{c1}{648}{917}{mm}% | |
\do{C}{c2}{458}{648}{mm}% | |
\do{C}{c3}{324}{458}{mm}% | |
\do{C}{c4}{229}{324}{mm}% | |
\do{C}{c5}{162}{229}{mm}% | |
\do{C}{c6}{114}{162}{mm}% | |
\do{C}{c7}{81}{114}{mm}% | |
\do{C}{c8}{57}{81}{mm}% | |
\do{C}{c9}{40}{57}{mm}% | |
\do{C}{c10}{28}{40}{mm}% | |
\do{D}{d0}{771}{1090}{mm}% | |
\do{D}{d1}{545}{771}{mm}% | |
\do{D}{d2}{385}{545}{mm}% | |
\do{D}{d3}{272}{385}{mm}% | |
\do{D}{d4}{192}{272}{mm}% | |
\do{D}{d5}{136}{192}{mm}% | |
\do{D}{d6}{96}{136}{mm}% | |
\do{D}{d7}{68}{96}{mm}% | |
\do{D}{d8}{48}{68}{mm}% | |
\do{J}{b0j}{1030}{1456}{mm}% | |
\do{J}{b1j}{728}{1030}{mm}% | |
\do{J}{b2j}{515}{728}{mm}% | |
\do{J}{b3j}{364}{515}{mm}% | |
\do{J}{b4j}{257}{364}{mm}% | |
\do{J}{b5j}{182}{257}{mm}% | |
\do{J}{b6j}{128}{182}{mm}% | |
\do{J}{b7j}{91}{128}{mm}% | |
\do{J}{b8j}{64}{91}{mm}% | |
\do{J}{b9j}{45}{64}{mm}% | |
\do{J}{b10j}{32}{45}{mm}% | |
\do{V}{a4var}{210}{283}{mm}% | |
\do{V}{b5var}{182}{230}{mm}% | |
\do{V}{hagaki}{100}{148}{mm}% | |
\do{U}{ansia}{8.5}{11}{in}% | |
\do{U}{ansib}{11}{17}{in}% | |
\do{U}{ansic}{17}{22}{in}% | |
\do{U}{ansid}{22}{34}{in}% | |
\do{U}{ansie}{34}{44}{in}% | |
\do{U}{letter}{8.5}{11}{in}% | |
\do{U}{legal}{8.5}{14}{in}% | |
\do{U}{executive}{7.25}{10.5}{in}% | |
\do{X}{screen}{225}{180}{mm}% | |
} | |
%% \[sclx@ps/<name>]: paper sizes | |
\def\do#1#2#3#4#5{% | |
\defcs{sclx@ps/#2}{\sclx@set@paper@size{#3#5}{#4#5}}% | |
} | |
\sclx@paper@size@list | |
%--------------------------------------- enter LaTeXish | |
%% errors | |
\def\sclx@error@bad@par{% | |
\sclx@panic | |
{Missing \string\begin{document}}% | |
} | |
%% \sclx@prev@font | |
\passexpandednobraces{\let\sclx@prev@font}{\the\font} | |
%% \sclx@leave@latexish | |
% Rolls back a bit of LaTeXish emulations, so as to avoid | |
% chaos caused by some module judging LaTeX is running. | |
\def\sclx@leave@latexish{% | |
\let\RequirePackage\@undefined | |
\let\end\sclx@org@end | |
\sclx@prev@font | |
\everypar{}% | |
} | |
%% enter LaTeXish | |
\everypar{\sclx@error@bad@par} | |
\nullfont | |
%--------------------------------------- all done | |
\sclx@exit% | |
%% EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment