From af0a12985674bb2c95947a4c9c439887b679f168 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 26 Feb 2007 01:15:02 +0000 Subject: new latex package qstest (22feb07) git-svn-id: svn://tug.org/texlive/trunk@3990 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/qstest/makematch.sty | 134 +++++++ Master/texmf-dist/tex/latex/qstest/qstest.sty | 434 +++++++++++++++++++++++ 2 files changed, 568 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/qstest/makematch.sty create mode 100644 Master/texmf-dist/tex/latex/qstest/qstest.sty (limited to 'Master/texmf-dist/tex/latex/qstest') diff --git a/Master/texmf-dist/tex/latex/qstest/makematch.sty b/Master/texmf-dist/tex/latex/qstest/makematch.sty new file mode 100644 index 00000000000..c57a8a66b22 --- /dev/null +++ b/Master/texmf-dist/tex/latex/qstest/makematch.sty @@ -0,0 +1,134 @@ +%% +%% This is file `makematch.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% makematch.dtx (with options: `package,etex') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from makematch.sty. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file makematch.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +%% +%% Copyright (C) 2006, 2007 QuinScape GmbH +%% http://www.quinscape.de +\NeedsTeXFormat{LaTeX2e} +\def\next$#1: #2.dtx #3 #4-#5-#6 #7${% + \ProvidesPackage{#2}[#4/#5/#6 1.#3 Pattern matching with + wildcards] +} +\next +$Id: makematch.dtx 7925 2007-02-23 14:22:19Z dkastrup $ +\newcommand\MakeMatcher[3][\relax]{% + \edef#2{\detokenize{#3}}% + \def\qst@mmtmp##1##2#1{\qst@parseonecase{##1}{##2}}% + \let\qst@comma= #1\relax + \edef#2##1{\noexpand\qst@setup##1% + \expandafter\qst@parsestart\expandafter\@firstoftwo + #2#1{#1\m@ne}\noexpand\qst@finish}} +\long\def\qst@matchalways#1#2#3{#2} +\long\def\qst@matchnever#1#2#3{#3} +\def\qst@setup{\let\MatchedTarget\@undefined + \let\qst@finish\@secondoftwo + \futurelet\qst@matchlist\qst@setupii} +\def\qst@setupii{\ifcase + \ifcat\noexpand\qst@matchlist\bgroup\@ne\fi + \ifx\qst@matchlist[\tw@\fi %] + \m@ne + \or + \expandafter\MakeMatchTarget\expandafter\qst@matchlist + \or + \expandafter\qst@setupiii + \else \expandafter\@gobble + \fi} +\def\qst@setupiii[#1]{\MakeMatchTarget[{#1}]\qst@matchlist} +\def\qst@parsestart#1#2{% + \ifcase + \ifx\qst@comma#2\@ne\fi + \ifx\qst@comma\relax + \else\ifx!#2#1\tw@\@ne\fi + \fi + \thr@@ + \or + \expandafter\qst@parsestart + \expandafter\@firstoftwo + \or + \expandafter\qst@parsestart + \expandafter\@secondoftwo + \or + \expandafter\qst@mmtmp + \expandafter#1% + \expandafter#2% + \fi +} +\def\qst@afterfi#1#2\fi{\fi#1} +\def\qst@parseonecase#1#2{% + \noexpand\qst@checkname {\qst@parsewild#2*\,23456789*}% + \noexpand#1\qst@parsestart\@firstoftwo} +\def\qst@parsewild#1*#2\,#3#4*{% + #1% + \ifx\,#2\,% + \else + #####3% + \qst@afterfi{\qst@skipwild#2\,#4*}% + \fi} +\def\qst@skipwild#1*#2\,{% + #1% + \ifcase + \ifx *#1*\ifx\,#2\,\else \@ne \fi \fi + \tw@ + \or + \expandafter\qst@skipwild + \or + \expandafter\qst@parsewild\expandafter*% + \fi#2\,} +\def\qst@checkname#1{% + \def\qst@mmtmp##1\,#1\,{#1\,\@nil}% + \expandafter\expandafter\expandafter\qst@checknameii + \expandafter\qst@mmtmp + \expandafter\,\qst@matchlist\,#1\,\@nil} +\def\qst@checknameii#1\,#2\@nil#3{% + \ifcase + \ifx\@nil#3\@ne\fi + \ifx\@nil#2\@nil \tw@\fi + \m@ne + \or + \expandafter\qst@checknamenomatch + \or + \expandafter\qst@checknamematch + \fi \expandafter\qst@checknameii\qst@mmtmp#1\,#2#3} +\def\qst@checknamenomatch#1\@nil#2{} +\def\qst@checknamematch#1\qst@mmtmp#2\,#3\@nil{% + \def\MatchedTarget{#2}% + \let\qst@finish} +\def\RemoveMatched#1{\ifx#1\MatchedTarget + \let#1\@empty + \else + \expandafter\def\expandafter\qst@mmtmp + \expandafter##\expandafter1\expandafter\,\MatchedTarget\,{##1\,}% + \expandafter\def\expandafter#1\expandafter{% + \romannumeral\expandafter\expandafter\expandafter\z@ + \expandafter\qst@remmat + \romannumeral\expandafter\expandafter\expandafter\z@ + \expandafter\qst@mmtmp\expandafter\,#1\,\@nil}% + \fi} +\def\qst@remmat\,#1\,\@nil{#1} +\newcommand\MakeMatchTarget[3][\relax]{% + \def\qst@mmtmp##1#1##2{##1\noexpand\,\qst@mmtmp##2}% + \edef#2{\expandafter\qst@mmtmp\expandafter + \@gobbletwo\expandafter#1\detokenize{#3}\iffalse#1\fi}% +} +\endinput +%% +%% End of file `makematch.sty'. diff --git a/Master/texmf-dist/tex/latex/qstest/qstest.sty b/Master/texmf-dist/tex/latex/qstest/qstest.sty new file mode 100644 index 00000000000..0e37234013d --- /dev/null +++ b/Master/texmf-dist/tex/latex/qstest/qstest.sty @@ -0,0 +1,434 @@ +%% +%% This is file `qstest.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% qstest.dtx (with options: `package,etex') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from qstest.sty. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file qstest.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +\errorcontextlines=\maxdimen +%% +%% Copyright (C) 2006, 2007 QuinScape GmbH +%% http://www.quinscape.de +\NeedsTeXFormat{LaTeX2e} +\def\next$Id: #1.dtx #2 #3-#4-#5 #6${% + \ProvidesPackage{#1}[#3/#4/#5 1.#2 QuinScape Unit Test Package] +} +\next +$Id: qstest.dtx 7896 2007-02-21 14:03:26Z dkastrup $ +\RequirePackage{makematch} +\newtoks\qst@tmptoks +\newcommand*{\TestErrors}{\MakeMatcher[,]\qst@errorcheck} +\TestErrors{*, !fails} +\newif\ifqst@error +\def\qst@ifqst@error{\qst@errorcheck\qst@options + \qst@errortrue\qst@errorfalse\ifqst@error} +\long\def\qst@error#1{% + \global\qst@testpassedfalse + \global\let\qst@lastfailure\qst@testname + \edef\qst@message{Failed: \qst@testname^^J#1}% + \@onelevel@sanitize\qst@message + \qst@failed} +\newif\ifqst@testpassed +\newcommand{\LogTests}[3]{% + \ifcsname qst:log:#1\endcsname \else + \expandafter\newwrite\csname qst:log:#1\endcsname + \qst@gpush\qst@passed{\qst@logentry+{#1}}% + \qst@gpush\qst@failed{\qst@logentry-{#1}}% + \global\expandafter\let\csname qst:+log:#1\endcsname\qst@matchnever + \global\expandafter\let\csname qst:-log:#1\endcsname\qst@matchnever + \fi + \expandafter\ifx \csname qst:+log:#1\endcsname \qst@matchnever + \PackageInfo{qstest}{Logging on: \jobname.#1}% + \ifnum\csname qst:log:#1\endcsname>\m@ne + \immediate\openout\csname qst:log:#1\endcsname\jobname.#1\relax + \fi + \fi + \MakeMatcher[,]\qst@tmp{#2}% + \global\expandafter\let\csname qst:+log:#1\endcsname\qst@tmp + \MakeMatcher[,]\qst@tmp{#3}% + \global\expandafter\let\csname qst:-log:#1\endcsname\qst@tmp +} +\long\def\qst@gpush#1#2{\xdef#1{\unexpanded{#2}% + \unexpanded\expandafter{#1}}} +\def\qst@logentry#1#2{\qst@maybelog#1{#2}{% + \immediate\write\csname qst:log:#2\endcsname{\qst@message}}} +\def\qst@maybelog#1#2#3{\csname qst:#1log:#2\endcsname\qst@options + {#3}{}} +\expandafter\let\csname qst:log:log\endcsname\m@ne +\global\expandafter\let\csname qst:+log:log\endcsname\qst@matchalways +\global\expandafter\let\csname qst:-log:log\endcsname\qst@matchalways +\def\qst@passed{\qst@maybelog+{log}% + {\PackageInfo{qstest}{\qst@message}}} +\def\qst@failed{\ifqst@error + \PackageError{qstest}{\qst@message}{}% + \else + \qst@maybelog-{log}{\PackageWarning{qstest}{\qst@message}}% + \fi} +\newcommand*\LogClose[1]{% + \expandafter\ifx \csname qst:+log:#1\endcsname\qst@matchnever + \else + \PackageInfo{qstest}{Logging off: \jobname.#1}% + \ifnum\csname qst:log:#1\endcsname>\m@ne + \immediate\closeout\csname qst:log:#1\endcsname + \fi + \global\expandafter\let\csname qst:+log:#1\endcsname\qst@matchnever + \global\expandafter\let\csname qst:-log:#1\endcsname\qst@matchnever + \fi +} +\def\IncludeTests{\MakeMatcher[,]\qst@includecheck} +\let\qst@includecheck\qst@matchalways +\RequirePackage{verbatim} +\newenvironment{qstest}[2]{% + \qst@testpassedtrue + \edef\qst@testname{\detokenize{#1}}% + \MakeMatchTarget[,]\qst@options{#2}% + \let\ifqst@error\qst@ifqst@error + \qst@includecheck\qst@options\ignorespaces{% + \let\endqstest\endcomment}}% + {\ifqst@testpassed + \edef\qst@message{Passed: \qst@testname}% + \qst@passed + \else + \ifx\qst@testname\qst@lastfailure + \else + \edef\qst@message{Failed: \qst@testname}% + \qst@failed + \fi + \fi} +\def\qst@testname{unspecified} +\newcommand\Expect[1][]{% + \edef\qst@tmpc{\unexpanded{#1}}% + \qst@expectarg\qst@defaultvalue\qst@expecttwo} +\def\qst@expectarg#1#2{% + \@ifstar{\qst@expectargii\edef#1#2}{\qst@expectargii\def#1#2}} +\def\qst@expectargii#1#2#3{\long\def\qst@tmp##1{% + #1#2####1####2####3####4####5####6####7####8####9{##1}% + \@onelevel@sanitize#2#3}% + \afterassignment\qst@expectargiii + \qst@tmptoks=} +\def\qst@expectargiii{\expandafter + \qst@tmp\expandafter{\the\qst@tmptoks}} +\def\qst@expecttwo{% + \ifx\qst@tmpc\@empty + \edef\qst@tmpc{\the\qst@tmptoks}% + \fi + \qst@expectarg\qst@tmpb\qst@expectfinish} +\def\qst@expectfinish{% + \ifx\qst@defaultvalue\qst@tmpb + \else + \qst@error{ + \string\Expect: \unexpanded\expandafter{\qst@tmpc}^^J + <\qst@tmpb^^J + >\qst@defaultvalue}% + \fi} +\def\InRange#1#2{% + \ifcase + \ifdim\qst@defaultvalue<#1\@ne\fi + \ifdim\qst@defaultvalue>#2\@ne\fi + \tw@ + \or + \qst@afterfi{{in [#1..#2]}}% + \or + \qst@afterfi{\expandafter{\qst@defaultvalue}}% + \fi} +\def\qst@afterfi#1#2\fi{\fi#1} +\newcommand*\NearTo[1]{% + \ifx[#1\expandafter\qst@nearto\expandafter[%]] + \else \qst@afterfi{\qst@nearto[0.05pt]{#1}}% + \fi} +\def\qst@nearto[#1]#2{% + \ifcase + \ifdim\qst@defaultvalue>\dimexpr#2+(#1)\relax \@ne\fi + \ifdim\qst@defaultvalue<\dimexpr#2-(#1)\relax \@ne\fi + \tw@ + \or + \qst@afterfi{{near[#1] to #2}}% + \or + \qst@afterfi{\expandafter{\qst@defaultvalue}}% + \fi} +\newcommand\ExpectIfThen[1]{% + \ifthenelse{#1}{}{% + \qst@error{ + \string\ExpectIfThen: \unexpanded{#1}% + }}} + \def\qst@advance#1{\edef#1{\number\numexpr(#1)+1}} +\long\def\qst@csmaketransition#1#2#3#4.{% + \qst@cssetstate{#1}% + \expandafter + \endgroup + \csname qst@cstrans:#2\expandafter\endcsname + \csname qst@cssaved\romannumeral\qst@csscope>\string#3\endcsname} +\def\CalledName#1{\expandafter\expandafter\expandafter\@gobble + \expandafter\strip@prefix\string#1} +\def\qst@csstate{\csname qst@csstate\romannumeral + \qst@csscope\endcsname} +\def\qst@cssetstate#1{% + \expandafter\expandafter\expandafter\xdef\qst@csstate{#1}} +\long\def\qst@csmakewildcard#1#2#3{\ifx#3\endExpectCallSequence + \else + \def\qst@csnomatch{\qst@csmaketransition{#1}{#2}}% + \fi + \qst@tmp} +\long\def\qst@cscheckempty#1#2{% + \ifcase\qst@cslockout{#1}\z@ + \expandafter\def\expandafter\qst@cslockout + \expandafter##\expandafter1\expandafter{% + \qst@cslockout{##1}\ifnum##1=#1\@ne\fi}% + \expandafter\expandafter\expandafter\qst@tmp + \csname qst@csstate:#1\expandafter\endcsname\expandafter#2% + \or \expandafter\qst@tmp + \fi} +\long\def\qst@csnext#1#2{% + \begingroup + \edef\qst@csscope{#1}% + \let\qst@csnomatch=\qst@csunexpected + \def\qst@cslockout##1{\ifnum\qst@csstate=##1\@ne\fi}% + \long\def\qst@tmp##1#2##2{##2#2}% + \expandafter\expandafter\expandafter\qst@tmp + \csname qst@csstate:\qst@csstate\endcsname#2% + #2{\qst@csnomatch}.} +\long\def\qst@csunexpected#1#2.{% + \qst@error{ + ExpectCallSequence: \string#1}% + \expandafter\expandafter\expandafter + \endgroup + \qst@cssavedcs#1% +} +\long\def\qst@cssavedcs#1{% + \csname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname} +\long\def\qst@csaddstate#1#2{% + \ifcsname qst@csstate:#1\endcsname \else + \expandafter\let\csname qst@csstate:#1\endcsname \@gobble + \fi + \long\expandafter + \def\csname qst@csstate:#1\expandafter\endcsname + \expandafter##\expandafter1\expandafter{\romannumeral + \expandafter\expandafter\expandafter\z@ + \csname qst@csstate:#1\endcsname{##1}#2}} +\def\qst@csaddempty#1#2{% + \expandafter\qst@csaddstate\expandafter{\number#1\expandafter}% + \expandafter{\expandafter##\expandafter1\expandafter{\expandafter + \qst@cscheckempty\expandafter{\number#2}}}} +\def\qst@csallocstate{0} +\def\qst@csalloctrans{0} +\def\qst@csscope{0} +\newenvironment{ExpectCallSequence}[1] +{% + \qst@advance\qst@csscope + \qst@cssetstate{\qst@csallocstate}% + \let\qst@csgroupstate\qst@csallocstate + \qst@advance\qst@csgroupstate + \qst@advance\qst@csgroupstate + \let\qst@csstack\@empty + \qst@csparse.{}*(#1){...}% +}{% + \def\qst@cssavedcs{\@gobble}% + \expandafter\qst@csnext\expandafter\qst@csscope + \csname end {ExpectCallSequence}\endcsname} +\long\def\qst@csparse#1{% + \ifcsname qst@csparse:\string#1\endcsname + \csname qst@csparse:\string#1\expandafter\expandafter\expandafter + \endcsname + \expandafter\@gobble + \else + \expandafter\qst@csparsedefault + \fi{#1}} +\expandafter\def\csname qst@cstrans:0\endcsname + #1{\expandafter\let\csname\CalledName#1\endcsname= #1% + \let#1=\@undefined + \csname\CalledName#1\endcsname} +\qst@csaddstate0{#1{\qst@csmakewildcard00}} +\qst@csaddempty{0}{1} +\expandafter\qst@csaddstate\expandafter1\expandafter{% + \csname end {ExpectCallSequence}\endcsname{\qst@csmaketransition21}} +\expandafter\let\csname qst@cstrans:1\endcsname\@gobble + +\def\qst@csalloctrans{2} +\def\qst@csallocstate{3} + +\expandafter\let\csname end {ExpectCallSequence}\endcsname + \endExpectCallSequence + +\expandafter\def\csname qst@csparse:...\endcsname{% + \ifx\qst@csstack\@empty + \else + \PackageError{qstest}{Unmatched `(' in call sequence %) + specification}{You need to fix this}% + \loop + \qst@csstack + \ifx\qst@csstack\@empty + \else + \repeat + \fi + \qst@csaddempty{\qst@csallocstate}{0}% + \qst@advance\qst@csallocstate + \ignorespaces} +\long\def\qst@csparsedefault#1{% + \ifcsname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname + \else \protected + \edef\qst@tmp{\noexpand\qst@csnext \qst@csscope \noexpand#1}% + \ifx#1\qst@tmp + \else + \expandafter\let + \csname qst@cssaved\romannumeral\qst@csscope>\string#1\endcsname + = #1% + \let#1\qst@tmp + \fi + \fi + \qst@csparsetransition{#1}\qst@csmaketransition} +\long\def\qst@csparsetransition#1#2{% + \let\qst@cslaststate\qst@csallocstate + \qst@advance\qst@csallocstate + \long\edef\qst@tmp##1##2{% + \noexpand\qst@csaddstate{\qst@cslaststate}{% + ##1{% + ##2{\qst@csallocstate}% + {\qst@csalloctrans}}}}% + \qst@tmp{#1}{#2}% + \expandafter\qst@advance\expandafter\qst@csalloctrans + \expandafter\afterassignment\expandafter\qst@csparse + \expandafter\long\expandafter\def + \csname qst@cstrans:\qst@csalloctrans\endcsname} +\expandafter\def\csname qst@csparse:.\endcsname{% + \qst@csparsetransition{##1}\qst@csmakewildcard} +\expandafter\def\csname qst@csparse:?\endcsname{% + \qst@csensurelaststate?% + \qst@csaddempty\qst@cslaststate\qst@csallocstate + \let\qst@cslaststate\@undefined + \qst@csparse} +\def\qst@csensurelaststate#1{\ifx\qst@cslaststate\@undefined + \PackageError{qstest}{Unexpected `#1' in call sequence}{% + Expect chaos to ensue}% + \def\qst@cslaststate{0}% + \fi} +\expandafter\def\csname qst@csparse:*\endcsname{% + \qst@csensurelaststate*% + \qst@csaddempty\qst@csallocstate\qst@cslaststate + \qst@advance\qst@csallocstate + \qst@csaddempty\qst@cslaststate\qst@csallocstate + \let\qst@cslaststate\@undefined + \qst@csparse} +\expandafter\def\csname qst@csparse:+\endcsname{% + \qst@csensurelaststate+% + \qst@csaddempty\qst@csallocstate\qst@cslaststate + \let\qst@cslaststate\qst@csallocstate + \qst@advance\qst@csallocstate + \qst@csaddempty\qst@cslaststate\qst@csallocstate + \let\qst@cslaststate\@undefined + \qst@csparse} +\expandafter\def\csname qst@csparse:(\endcsname{% + \edef\qst@csstack{\def\noexpand\qst@csstack{% + \unexpanded\expandafter{\qst@csstack}% + }% + \def\noexpand\qst@csgroupstate{\qst@csgroupstate}}% + \let\qst@csgroupstate\qst@csallocstate + \qst@advance\qst@csallocstate + \qst@csaddempty\qst@csgroupstate\qst@csallocstate + \qst@csparse} +\expandafter\def\csname qst@csparse:|\endcsname{% + \let\qst@cslaststate\qst@csallocstate + \edef\qst@csstack{\unexpanded\expandafter{\qst@csstack}% + \noexpand\qst@csaddempty{\qst@cslaststate}% + \noexpand\qst@csallocstate}% + \qst@advance\qst@csallocstate + \qst@csaddempty\qst@csgroupstate\qst@csallocstate + \let\qst@cslaststate\@undefined + \qst@csparse} +\expandafter\def\csname qst@csparse:)\endcsname{% + \let\qst@cslaststate\qst@csgroupstate + \ifx\qst@csstack\@empty + \PackageError{qstest}{Unmatched `)' in call sequence + specification}{You need to fix this}% + \fi + \qst@csstack + \qst@csparse +} +\expandafter\def\csname qst@csparse:`\endcsname{% + \qst@cssetstate{\qst@csallocstate}% + \let\qst@cslaststate\@undefined + \qst@csparse} +\expandafter\let\csname qst@csparse:^\expandafter\endcsname + \csname qst@csparse:`\endcsname +\expandafter\def\csname qst@csparse:'\endcsname{% + \qst@csaddempty{\qst@csallocstate}{1}% + \let\qst@cslaststate\qst@csallocstate + \qst@advance\qst@csallocstate + \qst@csparse} +\expandafter\let\csname qst@csparse:$%$ +\expandafter\endcsname\csname qst@csparse:'\endcsname +\newcommand*\SaveValueFile[1]{% + \ifnum\qst@savefile=\@auxout + \newwrite\qst@savefile + \else + \immediate\closeout\qst@savefile + \fi + \immediate\openout\qst@savefile #1\relax} +\def\qst@savefile{\@auxout} +\newcommand*\CloseValueFile{% + \ifnum\qst@savefile=\@auxout + \else + \immediate\closeout\qst@savefile + \fi} +\newcommand\SaveValue[1]{% + \edef\qst@tmpc{\detokenize{#1}}% + \ifnum\qst@savefile=\@auxout + \ifx\@onlypreamble\AtBeginDocument + \else + \PackageError{qstest}{You need to specify \string\SaveValueFile^^J + for test files without document.}{I can't use + `\string\SaveValue' before either `\string\begin% + {document}'^^J + or `\string\SaveValueFile'}% + \fi + \fi + \qst@expectarg\qst@defaultvalue\qst@saveval} +\def\qst@saveval{% + {\immediate\write\qst@savefile{\string\InternalSetValue^^J% + \expandafter\qst@cleanlf\qst@tmpc\qst@endcleanlf^^J% + \expandafter\qst@cleanlf\qst@defaultvalue\qst@endcleanlf^^J% + \string\EndInternalSetValue^^J}}} +\def\qst@cleanlf#1^^J{#1^% + ^J\qst@cleanlf} +\def\qst@endcleanlf^% + ^J\qst@cleanlf{:^^J} +\newcommand*\InternalSetValue{\begingroup + \let\do\@makeother\dospecials + \endlinechar`\^^J + \catcode`\^7 + \qst@setsavedii} +\begingroup +\catcode`\!=12 +\lccode`\!=`\\ +\lowercase{\endgroup + \def\qst@setsavedii#1:^^J#2:^^J!}EndInternalSetValue^^J{\endgroup + \expandafter\gdef\csname qst@value:\detokenize{#1}\endcsname{#2}} +\newcommand*{\EndInternalSetValue}{% + \PackageError{qstest}{\string\InternalSetValue\space got confused}% + {You probably wrote something bad to the save file}} +\def\SavedValue#1{% + \ifcsname qst@value:\detokenize{#1}\endcsname + \expandafter\expandafter\expandafter + {\csname qst@value:\detokenize{#1}\expandafter\endcsname\expandafter}% + \else + \expandafter\expandafter\expandafter{\expandafter\qst@defaultvalue + \expandafter}% + \fi} + +\endinput +%% +%% End of file `qstest.sty'. -- cgit v1.2.3