From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/csquotes/csquotes.sty | 2467 ++++++++++++++++++++++++++++ 1 file changed, 2467 insertions(+) create mode 100644 macros/latex/contrib/csquotes/csquotes.sty (limited to 'macros/latex/contrib/csquotes/csquotes.sty') diff --git a/macros/latex/contrib/csquotes/csquotes.sty b/macros/latex/contrib/csquotes/csquotes.sty new file mode 100644 index 0000000000..89ffabe7fd --- /dev/null +++ b/macros/latex/contrib/csquotes/csquotes.sty @@ -0,0 +1,2467 @@ +% Copyright (c) 2003-2011 Philipp Lehman. +% (c) 2015-2019 Joseph Wright. +% +% Permission is granted to copy, distribute and/or modify this +% software under the terms of the LaTeX Project Public License +% (LPPL), version 1.3c or any later version. +% +% This software is provided 'as is', without warranty of any kind, +% either expressed or implied, including, but not limited to, the +% implied warranties of merchantability and fitness for a +% particular purpose. + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{csquotes} + [2019/05/10 v5.2e context-sensitive quotations (JAW)] + +%% Compatibility and requirements + +\RequirePackage{etoolbox} +\RequirePackage{keyval} + +\@ifpackagelater{etoolbox}{2008/06/28} + {} + {\PackageError{csquotes} + {Outdated 'etoolbox' package} + {Upgrade to etoolbox v1.7 (2008/06/28) or later.\MessageBreak + I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak + This is a fatal error. I'm aborting now.} + \endinput} + +\@ifpackageloaded{inputenc} + {} + {\AtEndPreamble{% + \@ifpackageloaded{inputenc} + {\csq@warn@loadfirst{inputenc}} + {}}} + +\@ifpackageloaded{inputenx} + {} + {\AtEndPreamble{% + \@ifpackageloaded{inputenx} + {\csq@warn@loadfirst{inputenx}} + {}}} + +\@ifpackageloaded{ucs} + {\let\csq@ifucs\@firstoftwo} + {\let\csq@ifucs\@secondoftwo + \AtEndPreamble{% + \@ifpackageloaded{ucs} + {\let\csq@ifucs\@firstoftwo} + {}}} + +\AtEndPreamble{% + \@ifpackageloaded{biblatex} + {\@ifpackagelater{biblatex}{2009/05/30} + {} + {\csq@error + {Outdated 'biblatex' package} + {Upgrade to biblatex v0.8d (2009/05/30) or later.\MessageBreak + I found: '\csuse{ver@biblatex.sty}'}}} + {}} + +%% Category codes + +\def\csq@catcodes{\do\~\do\&\do\:\do\"\do\<\do\>} +\def\do#1{\catcode\number`#1=\the\catcode`#1\relax} +\edef\csq@catcodes{\csq@catcodes} +\let\do\noexpand + +\catcode`\~=\active +\catcode`\&=3 +\@makeother\: +\@makeother\" +\@makeother\< +\@makeother\> + +%% General + +\newtoggle{csq@tempsw} +\newtoggle{csq@quiet} +\newtoggle{csq@active} +\newtoggle{csq@block} +\newtoggle{csq@parbox} +\newtoggle{csq@parthreshold} +\newbool{csdisplay} + +\newcount\csq@reset +\newcount\csq@gtype +\newcount\csq@glevel +\newcount\csq@qlevel +\newcount\csq@maxlvl +\newcount\csq@tshold + +\providecommand{\@gobblethree}[3]{} +\providecommand{\@gobblefive}[5]{} +\providecommand{\@gobbletwo@optarg}[2][]{} + +% {}{}{} + +\def\csq@addto@list#1{% + \expandafter\csq@addto@list@i\csname\string#1\endcsname} +\def\csq@addto@list@i#1#2#3{% + \begingroup + \@tempswatrue + \def#3##1{\ifnum`#1=`##1\relax\@tempswafalse\fi}#2% + \expandafter\endgroup\if@tempswa + \appto#2{#3#1}% + \fi} + +% {} + +\def\csq@everypar#1{% + \let\csq@theeverypar#1% + \ifx\csq@theeverypar\@empty + \else + \csq@everypar@i + \fi} + +\def\csq@everypar@i{% + \leavevmode + \let\csq@new@everypar\everypar + \csq@ltx@everypar=\expandafter{\the\everypar}% + \csq@new@everypar={\the\csq@ltx@everypar\csq@theeverypar}% + \let\everypar\csq@ltx@everypar + \let\csq@everypar@i\relax} + +\newtoks\csq@ltx@everypar + +% Miscellaneous tests + +\newcommand*{\ifblockquote}{\iftoggle{csq@block}} + +\def\csq@ifsafeactives{% + \ifx\if@safe@actives\iftrue + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} + +\def\csq@iftypeset{% + \ifx\protect\@typeset@protect + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} + +\def\csq@ifstrings{% + \ifx\protect\string + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} + +\def\csq@ifnested{% + \iftoggle{csq@block} + {\@firstoftwo} + {\ifnumgreater\csq@qlevel\z@}} + +% Parsers for UTF-8 + +\def\csq@string#1{\csq@string@i#1&} +\def\csq@string@i#1#2&{% + \string#1\ifblank{#2}{}{\csq@string@i#2&}} + +\def\csq@number#1{\csq@number@i#1&} +\def\csq@number@i#1#2&{% + \number`#1 \ifblank{#2}{}{.\csq@number@i#2&}} + +\def\csq@utfprint#1{u8:\csq@utfprint@i#1&} +\def\csq@utfprint@i#1#2&{% + \number`#1 \ifblank{#2}{}{:\csq@utfprint@i#2&}} + +% Grouping control + +\protected\def\csq@bqgroup{% + \begingroup\leavevmode + \csq@glevel\currentgrouplevel + \csq@gtype\currentgrouptype} + +\protected\def\csq@eqgroup{% + \ifnum\csq@gtype=\currentgrouptype + \ifnum\csq@glevel=\currentgrouplevel + \else + \csq@err@glevel + \fi + \else + \csq@err@gtype + \fi + \endgroup} + +\AtEndDocument{% + \ifnum\csq@qlevel>\z@ + \csq@err@gleft + \fi} + +%% User feedback + +\protected\def\csq@warning@loose#1{% + \csq@warning{#1}\@gobbletwo} +\protected\def\csq@warning@strict#1{% + \csq@error} +\let\csq@warnorerr\csq@warning@loose + +\protected\def\csq@error#1#2{% + \PackageError{csquotes}{#1}{#2.}} + +\protected\def\csq@warning#1{% + \PackageWarning{csquotes}{#1}} + +\protected\def\csq@info#1{% + \iftoggle{csq@quiet} + {} + {\PackageInfo{csquotes}{#1\csq@noline}}} +\let\csq@noline\@gobble +\AtBeginDocument{\let\csq@noline\@empty} + +\protected\def\csq@logdebug#1{% + \begingroup + \def\MessageBreak{^^J(csquotes) \@spaces\@spaces\@spaces\space}% + \set@display@protect + \immediate\write\m@ne{Package csquotes Debug: #1\on@line.}% + \endgroup} + +\let\csq@debug\@gobble + +% Errors + +\protected\def\csq@errormark{% + \rule[0.25ex]{1.25ex}{1.25ex}} + +\protected\def\csq@eqerror{% + \csq@eqgroup + \csq@errormark} + +\protected\def\csq@mismatch#{% + \csq@errormark + \csq@err@mismatch} + +\protected\def\csq@err@mismatch#1{% + \csq@error + {Unbalanced groups or invalid nesting} + {#1}} + +\protected\def\csq@err@mmode#1{% + \csq@error + {'\string#1' invalid in math mode} + {This command may not be used in math mode}} + +\protected\def\csq@err@undef#1{% + \csq@error + {'\string#1' not defined} + {This command or environment environment appears to + be\MessageBreak undefined}} + +\protected\def\csq@err@opt#1{% + \csq@error + {Option '#1' invalid} + {The option you have supplied is invalid. See the csquotes + manual\MessageBreak for valid option keys and values}} + +\protected\def\csq@err@sfcodes#1{% + \csq@error + {'\string#1' not available} + {'\string#1' may not be used here because the\MessageBreak + punctuation tracker is not working at this point}} + +\protected\def\csq@err@glevel{% + \csq@mismatch{% + I have detected a group level mismatch. Verify that all + groups\MessageBreak and all active quotes are properly + balanced and nested. If you\MessageBreak continue, I + will write a summary of all previously opened + groups\MessageBreak to the transcript file}% + \showgroups} + +\protected\def\csq@err@gtype{% + \csq@mismatch{% + I have detected a group type mismatch. Verify that all + groups\MessageBreak and all active quotes are properly + balanced and nested. If you\MessageBreak continue, I + will write a summary of all previously opened + groups\MessageBreak to the transcript file}% + \showgroups} + +\protected\def\csq@err@gleft{% + \csq@err@mismatch{% + Still \number\csq@qlevel\space quote\ifnum\csq@qlevel>\@ne s\fi + \space open. If you continue, I will write a summary\MessageBreak + of all previously opened groups to the transcript file}% + \showgroups} + +\protected\def\csq@err@alloc{% + \csq@error + {Invalid argument} + {One of the arguments you have supplied is already allocated + as\MessageBreak active quote or delimiter}} + +\protected\def\csq@err@char{% + \csq@error + {Invalid argument} + {Only single characters with category code 12 or 13 may + be\MessageBreak allocated as active quotes. Numbers, + punctuation marks, and\MessageBreak characters which + are part of LaTeX's syntax or reserved\MessageBreak + for a specific purpose are invalid}} + +\protected\def\csq@err@utf{% + \csq@error + {Invalid argument} + {Only valid UTF-8 sequences representing a single + character\MessageBreak may be allocated as active quotes}} + +\protected\def\csq@err@nbquote{% + \csq@mismatch{% + You have nested a \@backslashchar blockquote. Block quotation + commands\MessageBreak may only be used on quotation level 0}}% + +\protected\def\csq@err@patch#1{% + \csq@error + {Patching #1 failed} + {This is an internal issue typically caused by a + conflict\MessageBreak between csquotes and some + other package. Modifying\MessageBreak the package + loading order may fix the problem}} + +\protected\def\csq@err@ucs{% + \csq@error + {ucs package not supported} + {The ucs package is not supported. If you want to use + UTF-8\MessageBreak encoded active quotes, try + '\string\usepackage[utf8]{inputenc}'.\MessageBreak + If you continue now, I will reject all UTF-8 encoded + arguments\MessageBreak as invalid}} + +% Warnings + +\protected\def\csq@warn@loadfirst#1{% + \csq@warnorerr + {Load '#1' before 'csquotes'} + {'#1' package loaded too late} + {Always load '#1' before 'csquotes'}} + +\protected\def\csq@warn@multilang#1{% + \csq@warnorerr + {No multilingual support.\MessageBreak #1} + {#1} + {Multilingual support does not seem to be available.\MessageBreak + Try loading the 'babel' or the 'polyglossia' package}} + +\protected\def\csq@warn@style#1{% + \csq@warnorerr + {No style for language '#1'.\MessageBreak + Using fallback style} + {No style for language '#1'} + {Define a style or alias for this language first}} + +\protected\def\csq@warn@location#1{% + \csq@warnorerr + {'\string#1' invalid at this point.\MessageBreak + Ignoring command} + {'\string#1' invalid at this point} + {This command may not be used at this particular + point.\MessageBreak See the manual of the 'csquotes' + package for details}} + +\protected\def\csq@warn@sfcodes#1{% + \csq@warnorerr + {No space factor codes for '#1' encoding.\MessageBreak + Punctuation tracker may fail} + {Punctuation tracker may fail at this point} + {No space factor codes for '#1' encoding. + See \string\DeclareQuoteGlyph\MessageBreak + in the 'csquotes' manual for details}} + +%% Outer quotations + +\protected\def\csq@oqmark{% + \csq@bqgroup + \ifnum\csq@qlevel>\z@ + \csq@mismatch{% + Level 1 quote invalid at this point. + The current level is \number\csq@qlevel}% + \advance\csq@qlevel\@ne + \let\csq@oqmark\csq@eqerror + \else + \csq@qlevel\@ne + \let\csq@oqmark\csq@qclose + \expandafter\csq@qopen + \fi} + +%% Inner quotations + +\protected\def\csq@iqmark{% + \csq@bqgroup + \ifnum\csq@qlevel>\@ne + \csq@mismatch{% + Level 2 quote invalid at this point. + The current level is \number\csq@qlevel}% + \advance\csq@qlevel\@ne + \let\csq@iqmark\csq@eqerror + \else + \csq@qlevel\tw@ + \let\csq@iqmark\csq@qclose + \expandafter\csq@qopen + \fi} + +%% Nestable quotations + +\protected\def\csq@oqopen{% + \csq@bqgroup + \csq@oqopen@i} + +\def\csq@oqopen@i{% + \advance\csq@qlevel\@ne + \csq@qopen} + +\protected\def\csq@iqopen{% + \csq@bqgroup + \csq@iqopen@i} + +\def\csq@iqopen@i{% + \ifnum\csq@qlevel=\z@ + \advance\csq@qlevel\tw@ + \else + \advance\csq@qlevel\@ne + \fi + \csq@qopen} + +%% Opening marks + +\def\csq@qopen{% + \ifnum\csq@qlevel>\csq@maxlvl + \csq@mismatch{% + Level \number\csq@qlevel\space quote invalid at this point. + The maximum level is \number\csq@maxlvl}% + \else + \csq@resetstyle + \csq@init + \csq@addkern@open + \ifodd\csq@qlevel + \let\csq@kernchar@i\csq@thequote@oopen + \csq@thequote@oopen + \else + \let\csq@kernchar@i\csq@thequote@iopen + \csq@thequote@iopen + \fi + \csq@setmarker@open + \expandafter\csq@fixkern + \fi} + +%% Closing marks + +\protected\def\csq@qclose{% + \csq@qclose@i{}} + +\def\csq@qclose@i{% + \ifnum\csq@qlevel=\z@ + \csq@mismatch{% + Cannot close any quote. The current level is 0}% + \else + \ifnum\csq@qlevel>\csq@maxlvl + \csq@eqerror + \else + \expandafter\expandafter + \expandafter\csq@qclose@ii + \fi + \fi} + +\def\csq@qclose@ii#1{% + \ifdim\lastkern=\csq@omitmarker + #1\csq@eqgroup + \else + \csq@addkern@close + \ifodd\csq@qlevel + \csq@thequote@oclose + \let\csq@kernchar@i\csq@thequote@oclose + \else + \csq@thequote@iclose + \let\csq@kernchar@i\csq@thequote@iclose + \fi + \ifnum\csq@qlevel>\@ne + \csq@setmarker@close + \fi + \ifblank{#1}{}{\expandafter#1}% + \expandafter\csq@eqgroup + \expandafter\def + \expandafter\csq@kernchar@i + \expandafter{\csq@kernchar@i}% + \expandafter\csq@fixkern + \fi} + +%% Style initialization + +\def\csq@init{% + \csq@setsfcodes + \ifodd\csq@qlevel + \csq@thequote@oinit + \csq@everypar\csq@thequote@omiddle + \else + \csq@thequote@iinit + \csq@everypar\csq@thequote@imiddle + \fi + \csq@init@kern{open}{o}{i}% + \csq@init@kern{close}{i}{o}} + +\def\csq@init@kern#1#2#3{% + \begingroup + \settowidth{\@tempdima}{% + \csuse{csq@thequote@#2#1}% + \csuse{csq@thequote@#3#1}}% + \settowidth{\@tempdimb}{% + \csuse{csq@thequote@#2#1}\unkern + \csuse{csq@thequote@#3#1}}% + \ifdim\@tempdima=\@tempdimb + \let\csq@tempa\endgroup + \else + \edef\csq@tempa{\endgroup + \csdef{csq@thekern@#1}{% + \the\dimexpr\@tempdima-\@tempdimb\relax}}% + \fi + \csq@tempa} + +\def\blx@hook@parboxrestore{% + \let\csq@theeverypar\@empty + \csq@qlevel\z@ + \toggletrue{csq@parbox}% + \togglefalse{csq@block}} + +\protected\def\blx@parboxrestore{% + \ifx\protect\noexpand % \@outputpage + \else + \blx@hook@parboxrestore + \fi} + +\appto\@parboxrestore{\blx@parboxrestore} + +%% Restore kerning + +\def\csq@fixkern{% + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \expandafter\csq@fixkern@i} + +\def\csq@fixkern@i{% + \futurelet\csq@kernchar@ii\csq@fixkern@ii} + +\def\csq@fixkern@ii{% + \ifcat a\noexpand\csq@kernchar@ii + \expandafter\csq@fixkern@iii + \else + \ifcat 1\noexpand\csq@kernchar@ii + \expandafter\expandafter + \expandafter\csq@fixkern@iii + \fi + \fi} + +\def\csq@fixkern@iii{% + \begingroup + \settowidth{\@tempdima}{% + \csq@kernchar@i\csq@kernchar@ii}% + \settowidth{\@tempdimb}{% + \csq@kernchar@i\kern\z@\csq@kernchar@ii}% + \ifdim\@tempdima=\@tempdimb + \else + \addtolength{\@tempdima}{-\@tempdimb}% + \penalty\@M\hskip\@tempdima\relax + \fi + \endgroup} + +%% Detect and kern adjoining quotes + +\def\csq@kernmarker{13sp} +\def\csq@omitmarker{17sp} +\let\csq@themarker\csq@kernmarker +\def\csq@thekern@open{\csq@thequote@kern} +\def\csq@thekern@close{\csq@thequote@kern} +\def\csq@thequote@kern{0.1em} + +\def\csq@setmarker@open{% + \penalty\@M + \hskip-\csq@themarker\relax + \hskip\csq@themarker\relax} + +\def\csq@setmarker@close{% + \kern-\csq@themarker\relax + \kern\csq@themarker\relax} + +\def\csq@addkern@open{% + \ifdim\lastskip=\csq@kernmarker + \unskip\unskip\unpenalty + \unkern % EC fix + \ifdim\csq@thekern@open=\z@ + \else + \penalty\@M\hskip\csq@thekern@open\relax + \fi + \fi} + +\def\csq@addkern@close{% + \ifdim\lastkern=\csq@kernmarker + \unkern\unkern + \ifdim\csq@thekern@close=\z@ + \else + \penalty\@M\hskip\csq@thekern@close\relax + \fi + \fi} + +%% Punctuation + +% 1001 apostrophe (biblatex only) +% 1002 abbreviation dot (biblatex only) +% 1003/1250 comma +% 1004/1500 semicolon +% 1005/2000 colon +% 1006/3000 period +% 1007/3001 exclamation mark +% 1008/3002 question mark +% 1009 suppress punctuation (biblatex only) + +\mathchardef\csq@sf@comma=1003 +\mathchardef\csq@sf@semicolon=1004 +\mathchardef\csq@sf@colon=1005 +\mathchardef\csq@sf@period=1006 +\mathchardef\csq@sf@exclam=1007 +\mathchardef\csq@sf@question=1008 +\mathchardef\csq@sf@threshold@low=1002 +\mathchardef\csq@sf@threshold@term=1005 +\mathchardef\csq@sf@threshold@high=1009 + +\def\csq@setsfcodes{% + \ifcsdef{csq@sfcodes@\f@encoding} + {\csuse{csq@sfcodes@\f@encoding}} + {\csq@warn@sfcodes\f@encoding}% + \sfcode`\)=\z@ + \sfcode`\]=\z@ + \ifnum\sfcode`\.>2000 + \csq@setencodes + \else + \csq@setfrcodes + \fi + \let\frenchspacing\csq@setfrcodes + \let\nonfrenchspacing\csq@setencodes + \let\csq@setsfcodes\relax} + +\def\csq@ifsfcodes{% + \ifnumequal\csq@sf@question + {\ifcsdef{csq@sfactor@\the\sfcode`\?} + {\csuse{csq@sfactor@\the\sfcode`\?}} + {\sfcode`\?}}} + +\def\csq@setfrcodes{% + \ifnum\sfcode`\A=\@m + \else + \csq@setazcodes + \fi + \sfcode`\,=1003 + \sfcode`\;=1004 + \sfcode`\:=1005 + \sfcode`\.=1006 + \sfcode`\!=1007 + \sfcode`\?=1008 +} + +\def\csq@setencodes{% + \sfcode`\,=1250 + \sfcode`\;=1500 + \sfcode`\:=2000 + \sfcode`\.=3000 + \sfcode`\!=3001 + \sfcode`\?=3002 +} + +\begingroup +\let\csq@setazcodes\@empty +\def\csq@tempa{% + \xdef\csq@setazcodes{\csq@setazcodes\sfcode\the\@tempcnta=\@m} + \ifnum\@tempcnta<\@tempcntb + \advance\@tempcnta\@ne + \expandafter\csq@tempa + \fi} +\@tempcnta`\A +\@tempcntb`\Z +\csq@tempa +\ifnum\inputlineno=\m@ne\else + \@tempcnta"80 + \@tempcntb"9C + \csq@tempa + \@tempcnta"C0 + \@tempcntb"DF + \csq@tempa +\fi +\endgroup + +\csdef{csq@sfactor@1250}{1003} +\csdef{csq@sfactor@1500}{1004} +\csdef{csq@sfactor@2000}{1005} +\csdef{csq@sfactor@3000}{1006} +\csdef{csq@sfactor@3001}{1007} +\csdef{csq@sfactor@3002}{1008} + +\def\csq@spacefactor{% + \ifhmode + \ifcsdef{csq@sfactor@\the\spacefactor} + {\csuse{csq@sfactor@\the\spacefactor}} + {\the\spacefactor}% + \else + 1000% + \fi} + +% {}{} + +\newcommand*{\ifpunct}{% + \csq@ifsfcodes + {\ifnumgreater\csq@spacefactor\csq@sf@threshold@low + {\ifnumless\csq@spacefactor\csq@sf@threshold@high} + {\@secondoftwo}} + {\csq@err@sfcodes\ifpunct + \@secondoftwo}} + +% {}{}{} + +\newrobustcmd*{\iftextpunct}[1]{% + \csq@ifpuncttest{#1}{\ifpunct}} + +% {}{} + +\newcommand*{\ifterm}{% + \csq@ifsfcodes + {\ifnumgreater\csq@spacefactor\csq@sf@threshold@term + {\ifnumless\csq@spacefactor\csq@sf@threshold@high} + {\@secondoftwo}} + {\csq@err@sfcodes\ifterm + \@secondoftwo}} + +% {}{}{} + +\newrobustcmd*{\iftextterm}[1]{% + \csq@ifpuncttest{#1}{\ifterm}} + +% {}{}{} + +\newrobustcmd*{\ifpunctmark}[1]{% + \csq@ifsfcodes + {\ifbool{hmode} + {\ifnumequal{\sfcode`#1}\spacefactor} + {\@secondoftwo}} + {\csq@err@sfcodes\ifpunctmark + \@secondoftwo}} + +% {}{}{}{} + +\newrobustcmd*{\iftextpunctmark}[2]{% + \csq@ifpuncttest{#1}{\ifpunctmark{#2}}} + +\def\csq@ifpuncttest#1#2{% + \begingroup + \setbox\@tempboxa=\hbox{% + \csq@ifsfcodes\relax\csq@setsfcodes + #1#2 + {\aftergroup\@firstoftwo} + {\aftergroup\@secondoftwo}}% + {\endgroup\@firstoftwo} + {\endgroup\@secondoftwo}} + +%% Multilingual interface + +\def\csq@setstyle#1{% + \begingroup + \let\if@safe@actives\iftrue + \ifcsdef{csq@qstyle@#1} + {\edef\csq@tempa{\endgroup + \def\noexpand\csq@currentstyle{#1}% + \noexpand\csuse{csq@qstyle@#1}}% + \csq@tempa} + {\csq@warnorerr + {Quote style '#1' not defined.\MessageBreak Ignoring command} + {Quote style '#1' not defined} + {Define the style or alias first} + \endgroup}} + +\def\csq@resetstyle{% + \ifnum\csq@reset=\@ne + \ifx\csq@currentstyle\languagename + \else + \ifcsundef{csq@qstyle@\languagename} + {\csq@warn@style\languagename + \csq@setstyle{fallback}} + {\csq@setstyle{\languagename}}% + \fi + \fi} + +\def\csq@savelang{% + \ifdef\csq@mainlang + {} + {\edef\csq@mainlang{\languagename}}} + +\def\csq@resetlang{% + \ifdef\csq@mainlang + {\csuse{otherlanguage*}{\csq@mainlang}% + \let\csq@resetlang\relax} + {}} + +\protected\long\def\csq@switchlang#1{% + \ifdef\csq@mainlang + {\begingroup + \csuse{otherlanguage*}{\csq@mainlang}% + #1% + \csuse{endotherlanguage*}% + \endgroup} + {#1}} + +% \lowercase: workaround for page headers of book.cls et al. + +\def\csq@lang#1{% + \csq@savelang + \lowercase{\csuse{otherlanguage*}{#1}}} +\def\csq@endlang{% + \csuse{endotherlanguage*}} + +\def\csq@nolang#1{% + \begingroup + \lowercase{\def\csq@tempa{#1}}% + \csq@warn@multilang{Cannot switch to language '\csq@tempa'}% + \endgroup} + +\def\csq@hyph#1{% + \csq@savelang + \lowercase{\csq@hyphenrules{#1}}} +\let\csq@endhyph\@empty + +\def\csq@nohyph#1{% + \begingroup + \lowercase{\def\csq@tempa{#1}}% + \csq@warn@multilang{No hyphenation rules for '\csq@tempa'}% + \endgroup} + +\def\csq@hyphenrules#1{% + \language\csname l@#1\endcsname\relax + \ifcsundef{#1hyphenmins} + {\csq@sethyphenmins\tw@\thr@@} + {\expandafter\expandafter\expandafter\csq@sethyphenmins + \csname#1hyphenmins\endcsname}} + +\def\csq@sethyphenmins#1#2{% + \lefthyphenmin#1\relax + \righthyphenmin#2\relax} + +\appto\csq@hook@multilang{% + \appto\blx@hook@parboxrestore{\csq@resetlang}% + \ifundef\l@usenglish + {\ifundef\l@USenglish + {} + {\let\l@usenglish\l@USenglish}} + {}% + \ifundef\l@ukenglish + {\ifundef\l@UKenglish + {} + {\let\l@ukenglish\l@UKenglish}} + {}% + \ifcase\csq@reset + \or + \or + \csq@info{Enabling multilingual quotes}% + \csq@reset\@ne + \else + \csq@info{Adjusting default style}% + \ifcsdef{csq@qstyle@\csq@main@language} + {\DeclareQuoteAlias{\csq@main@language}{default}} + {\csq@warn@style\csq@main@language + \DeclareQuoteAlias{fallback}{default}}% + \fi} + +\appto\csq@hook@nomultilang{% + \ifcase\csq@reset + \or + \csq@warn@multilang{Cannot enable multilingual quotes}% + \or + \or + \csq@warn@multilang{Cannot adjust default style}% + \fi + \csq@reset\z@ + \let\csq@hyph\csq@nohyph + \let\csq@endhyph\@empty + \let\csq@lang\csq@nolang + \let\csq@endlang\@empty + \let\csq@switchlang\@firstofone + \def\csq@resetqstyle{% + \csq@warn@multilang{Cannot enable multilingual quotes}}} + +%% Markup with control sequences + +% Argument parsers + +% {}[][] => +% {\mkcitation}{}{} + +\def\csq@getcargs#1{% + \@ifnextchar[%] + {\csq@getcargs@i{#1}} + {\csq@getcargs@i{#1}[]}} + +\long\def\csq@getcargs@i#1[#2]{% + \@ifnextchar[%] + {\csq@getcargs@ii{#1}{#2}} + {\csq@getcargs@ii{#1}{#2}[]}} + +\long\def\csq@getcargs@ii#1#2[#3]{% + #1{\mkcitation}{#2}{#3}} + +% {}[
][]{}[] =>
+%  {\mkccitation}{\csq@cite[
][]{}}{}
+
+\def\csq@getccargs#1{%
+  \@ifnextchar[%]
+    {\csq@getccargs@i{#1}{}}
+    {\csq@getccargs@ii{#1}{}}}
+
+\long\def\csq@getccargs@i#1#2[#3]{%
+  \@ifnextchar[%]
+    {\csq@getccargs@i{#1}{#2[{#3}]}}
+    {\csq@getccargs@ii{#1}{#2[{#3}]}}}
+
+\long\def\csq@getccargs@ii#1#2#3{%
+  \@ifnextchar[%]
+    {\csq@getccargs@iii{#1}{#2}{#3}}
+    {\csq@getccargs@iii{#1}{#2}{#3}[]}}
+
+\long\def\csq@getccargs@iii#1#2#3[#4]{%
+  #1{\mkccitation}{\csq@cite#2{#3}}{#4}}
+
+% {} => {}
+
+\protected\long\def\csq@getpunct#1{%
+  \begingroup
+  \def\csq@tempa{\endgroup#1}%
+  \futurelet\@let@token\csq@getpunct@i}
+
+\def\csq@getpunct@i{%
+  \expandafter\csq@getpunct@ii\csq@allpunct&}
+
+\def\csq@getpunct@ii#1{%
+  \ifx#1&%
+    \expandafter\csq@getpunct@v
+  \fi
+  \ifx#1\@let@token
+    \expandafter\csq@getpunct@iii
+  \fi
+  \csq@getpunct@ii}
+
+\def\csq@getpunct@iii#1\csq@getpunct@ii#2&{%
+  \expandafter\csq@getpunct@iv\csq@autopunct&}
+
+\def\csq@getpunct@iv#1{%
+  \ifx#1&%
+    \expandafter\csq@getpunct@vi
+  \fi
+  \ifx#1\@let@token
+    \expandafter\csq@getpunct@vii
+  \fi
+  \csq@getpunct@iv}
+
+\def\csq@getpunct@v#1\csq@getpunct@ii{\csq@tempa{}\@empty}
+\def\csq@getpunct@vi#1\csq@getpunct@iv{\csq@tempa{}}
+\def\csq@getpunct@vii#1\csq@getpunct@iv#2{\csq@tempa{#3}\@empty}
+
+% Punctuation
+
+\newrobustcmd*{\DeclareAutoPunct}[1]{%
+  \ifblank{#1}
+    {\def\csq@autopunct{}}
+    {\def\csq@autopunct{#1}}}
+
+\let\csq@autopunct\@empty
+\def\csq@allpunct{.,;:!?}
+
+\AfterEndPreamble{% babel
+  \begingroup
+  \makeatletter
+  \endlinechar\m@ne
+  \edef\csq@tempa{%
+    \noexpand\scantokens{%
+      \gdef\noexpand\csq@autopunct{\csq@autopunct}%
+      \gdef\noexpand\csq@allpunct{\csq@allpunct}}}%
+  \csq@tempa
+  \endgroup}
+
+% Plain quotes
+
+\newrobustcmd*{\enquote}{%
+  \@ifstar{\csq@quote@ii{}{}}{\csq@quote@i{}{}}}
+
+% {}{}{}
+
+\long\def\csq@quote@i#1#2#3{%
+  \csq@bqgroup#1\csq@oqopen@i#3\csq@qclose@i{#2}}
+\long\def\csq@quote@ii#1#2#3{%
+  \csq@bqgroup#1\csq@iqopen@i#3\csq@qclose@i{#2}}
+
+% Plain quotes + language switching
+
+\newrobustcmd*{\foreignquote}{%
+  \@ifstar\csq@fquote@ii\csq@fquote@i}
+
+\def\csq@fquote@i#1{\csq@quote@i{\csq@lang{#1}}{\csq@endlang}}
+\def\csq@fquote@ii#1{\csq@quote@ii{\csq@lang{#1}}{\csq@endlang}}
+
+\newrobustcmd*{\hyphenquote}{%
+  \@ifstar\csq@hquote@ii\csq@hquote@i}
+
+\def\csq@hquote@i#1{\csq@quote@i{\csq@hyph{#1}}{\csq@endhyph}}
+\def\csq@hquote@ii#1{\csq@quote@ii{\csq@hyph{#1}}{\csq@endhyph}}
+
+% PDF strings
+
+\long\def\csq@pdf@quote#1{%
+  \if#1*\relax
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi
+    {\csq@pdf@quote@ii}
+    {\csq@pdf@quote@i{#1}}}
+
+\long\def\csq@pdf@quote@i#1{%
+  \csq@pdf@ooqmark #1\csq@pdf@coqmark}
+\long\def\csq@pdf@quote@ii#1{%
+  \csq@pdf@oiqmark #1\csq@pdf@ciqmark}
+
+\long\def\csq@pdf@fquote#1{%
+  \if#1*\relax
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi
+    {\expandafter\csq@pdf@quote@ii\@gobble}
+    {\csq@pdf@quote@i}}
+
+\appto\csq@hook@hyperref{%
+  \let\enquote\csq@pdf@quote
+  \let\foreignquote\csq@pdf@fquote
+  \let\hyphenquote\csq@pdf@fquote}
+
+% Text quotes
+
+\newrobustcmd*{\textquote}{%
+  \@ifstar
+    {\csq@getcargs{\csq@tquote{}{}{\csq@iqopen@i}}}
+    {\csq@getcargs{\csq@tquote{}{}{\csq@oqopen@i}}}}
+
+% {}{}{}{}{}{}{}
+
+\long\def\csq@tquote#1#2#3#4#5#6#7{%
+  \csq@getpunct{\csq@tquote@i{#1}{#2}{#3}{#4}{#5}{#6}{#7}}}
+
+% {}{}{}{}{}{}{}{}
+
+\long\def\csq@tquote@i#1#2#3#4#5#6#7#8#9{%
+  \begingroup
+  \csq@setsfcodes
+  \edef\csq@tempa{%
+    \unexpanded{%
+      \mktextquote
+      {#3}%
+      {#7}%
+      {\csq@qclose@i{#2}}%
+      {#6}{#8}}%
+    {\ifblank{#5}
+       {}
+       {\unexpanded{\csq@switchlang{#4{#5}}}}}}%
+  \csq@bqgroup#1\csq@tempa#9%
+  \endgroup}
+
+% {}{}{}{}{}{}
+
+\newcommand{\mktextquote}[6]{#1#2#4#3#6#5}
+
+% Text quotes + language switching
+
+\newrobustcmd*{\foreigntextquote}{%
+  \@ifstar\csq@ftquote@ii\csq@ftquote@i}
+
+\def\csq@ftquote@i#1{%
+  \csq@getcargs{\csq@tquote{\csq@lang{#1}}{\csq@endlang}{\csq@oqopen@i}}}
+\def\csq@ftquote@ii#1{%
+  \csq@getcargs{\csq@tquote{\csq@lang{#1}}{\csq@endlang}{\csq@iqopen@i}}}
+
+\newrobustcmd*{\hyphentextquote}{%
+  \@ifstar\csq@htquote@ii\csq@htquote@i}
+
+\def\csq@htquote@i#1{%
+  \csq@getcargs{\csq@tquote{\csq@hyph{#1}}{\csq@endhyph}{\csq@oqopen@i}}}
+\def\csq@htquote@ii#1{%
+  \csq@getcargs{\csq@tquote{\csq@hyph{#1}}{\csq@endhyph}{\csq@iqopen@i}}}
+
+% Integrated text quotes
+
+\newrobustcmd*{\textcquote}{%
+  \@ifstar
+    {\csq@getccargs{\csq@tquote{}{}{\csq@iqopen@i}}}
+    {\csq@getccargs{\csq@tquote{}{}{\csq@oqopen@i}}}}
+
+% Integrated text quotes + language switching
+
+\newrobustcmd*{\foreigntextcquote}{%
+  \@ifstar\csq@ftcquote@ii\csq@ftcquote@i}
+
+\def\csq@ftcquote@i#1{%
+  \csq@getccargs{\csq@tquote{\csq@lang{#1}}{\csq@endlang}{\csq@oqopen@i}}}
+\def\csq@ftcquote@ii#1{%
+  \csq@getccargs{\csq@tquote{\csq@lang{#1}}{\csq@endlang}{\csq@iqopen@i}}}
+
+\newrobustcmd*{\hyphentextcquote}{%
+  \@ifstar\csq@htcquote@ii\csq@htcquote@i}
+
+\def\csq@htcquote@i#1{%
+  \csq@getccargs{\csq@tquote{\csq@hyph{#1}}{\csq@endhyph}{\csq@oqopen@i}}}
+\def\csq@htcquote@ii#1{%
+  \csq@getccargs{\csq@tquote{\csq@hyph{#1}}{\csq@endhyph}{\csq@iqopen@i}}}
+
+% PDF strings
+
+\appto\csq@hook@hyperref{%
+  \def\textquote{\pdfstringdefWarn\textquote}%
+  \def\foreigntextquote{\pdfstringdefWarn\foreigntextquote}%
+  \def\hyphentextquote{\pdfstringdefWarn\hyphentextquote}%
+  \def\textcquote{\pdfstringdefWarn\textcquote}%
+  \def\foreigntextcquote{\pdfstringdefWarn\foreigntextcquote}%
+  \def\hyphentextcquote{\pdfstringdefWarn\hyphentextcquote}}
+
+% Block quotes
+
+\newrobustcmd*{\blockquote}{%
+  \csq@getcargs{\csq@bquote{}{}}}
+
+% {}{}{}{}{}{}
+
+\long\def\csq@bquote#1#2#3#4#5#6{%
+  \csq@ifnested
+    {\csq@err@nbquote}
+    {\csq@getpunct{%
+       \ifboolexpr{ bool {inner} and bool {hmode} }
+         {\csq@bquote@ii}
+	 {\ifbool{csdisplay}
+	    {\csq@bquote@i}
+	    {\iftoggle{csq@parbox}\csq@bquote@ii\csq@bquote@i}}%
+	 {#1}{#2}{#3}{#4}{#5}{#6}}}}
+
+% {}{}{}{}{}{}{}
+
+\long\def\csq@bquote@i#1#2#3#4#5#6{%
+  \begingroup
+  \blockquote@prehook
+  \togglefalse{csq@tempsw}%
+  \setbox\@tempboxa=\vbox{%
+    \csuse{csq@bcount@\csq@thresholdtype}%
+    \parindent\z@
+    \blockquote@parsehook
+    #1#6#5#2\endgraf\expandafter}\expandafter
+  \@tempcnta\number\prevgraf\relax
+  \iftoggle{csq@tempsw}
+    {\csq@debug{%
+       \@backslashchar blockquote has \number\@tempcnta\space
+       \csq@thresholdtype\space and manual breaks.\MessageBreak
+       Setting as display}}
+    {\ifnumgreater\@tempcnta\csq@tshold
+       {\toggletrue{csq@tempsw}}
+       {}%
+     \csq@debug{%
+       \@backslashchar blockquote has \number\@tempcnta\space
+       \csq@thresholdtype. Threshold is \number\csq@tshold.\MessageBreak
+       Setting \iftoggle{csq@tempsw}{as display}{inline}}}%
+  \blockquote@posthook
+  \iftoggle{csq@tempsw}
+    {\aftergroup\@firstoftwo}
+    {\aftergroup\@secondoftwo}%
+  \endgroup
+  \csq@bquote@iii\csq@bquote@ii{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\csq@bcount@lines{%
+  \iftoggle{csq@parthreshold}
+    {\def\par{\global\toggletrue{csq@tempsw}\@@par}%
+     \let\newline\par
+     \let\\\par}
+    {}%
+  \parfillskip\z@\@plus1fil\relax}
+
+\def\csq@bcount@words{%
+  \iftoggle{csq@parthreshold}
+    {\def\par{\global\toggletrue{csq@tempsw}\space}%
+     \let\newline\par
+     \let\\\par}
+    {\let\par\space
+     \let\newline\space
+     \let\\\space}%
+  \let\nobreakspace\space
+  \let~\space
+  \hsize\z@
+  \hyphenpenalty\@M
+  \exhyphenpenalty\csq@splitcomp
+  \relpenalty\@M
+  \binoppenalty\@M
+  \let\allowbreak\relax
+  \hfuzz\maxdimen}
+
+\newcommand*{\blockquote@prehook}{%
+  \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
+  \edef\csq@tempa{\cl@@ckpt}%
+  \let\@elt\relax
+  \@fileswfalse}
+
+\newcommand*{\blockquote@posthook}{%
+  \csq@tempa}
+
+\newcommand*{\blockquote@parsehook}{%
+  \let\csq@nbgobble\@gobble
+  \let\csq@bquote\@gobblefive
+  \let\csq@warnorerr\@gobblethree
+  \let\csq@error\@gobbletwo
+  \let\csq@warning\@gobble
+  \let\csq@info\@gobble
+  \def\textelp{\@ifstar\@gobble\@gobble}%
+  \let\textins\textelp
+  \let\marginpar\@gobbletwo@optarg
+  \let\label\@gobble
+  \let\index\@gobble
+  \let\glossary\@gobble}
+
+\newrobustcmd*{\BlockquoteDisable}{%
+  \gappto\blockquote@parsehook}
+
+\let\csq@nbgobble\@firstofone
+
+% {}{}{}{}{}{}{}
+
+\def\csq@bquote@ii#1#2{\csq@tquote@i{#1}{#2}{\csq@oqopen@i}}
+
+% {}{}{}{}{}{}{}
+
+\long\def\csq@bquote@iii#1#2#3#4#5#6#7#8{%
+  \begin{\csq@blockenvironment}%
+  \toggletrue{csq@block}%
+  \csq@setsfcodes
+  \edef\csq@tempa{%
+    \unexpanded{%
+      \mkblockquote
+      {#6}%
+      {#5}{#7}}%
+    {\ifblank{#4}
+       {}
+       {\unexpanded{\csq@switchlang{#3{#4}}}}}}%
+  #1\csq@tempa#8#2%
+  \end{\csq@blockenvironment}}
+
+% {}{}{}{}
+
+\newcommand{\mkblockquote}[4]{#1#2#4#3}
+
+% Block quotes + language switching
+
+\newrobustcmd*{\foreignblockquote}[1]{%
+  \csq@getcargs{\csq@bquote{\csq@lang{#1}}{\csq@endlang}}}
+
+\newrobustcmd*{\hyphenblockquote}[1]{%
+  \csq@getcargs{\csq@bquote{\csq@hyph{#1}}{\csq@endhyph}}}
+
+\newrobustcmd*{\hybridblockquote}[1]{%
+  \csq@getcargs{%
+    \csq@bquote
+      {\iftoggle{csq@block}{\csq@lang}{\csq@hyph}{#1}}
+      {\iftoggle{csq@block}{\csq@endlang}{\csq@endhyph}}}}
+
+% Integrated block quotes
+
+\newrobustcmd*{\blockcquote}{%
+  \csq@getccargs{\csq@bquote{}{}}}
+
+% Integrated block quotes + language switching
+
+\newrobustcmd*{\foreignblockcquote}[1]{%
+  \csq@getccargs{\csq@bquote{\csq@lang{#1}}{\csq@endlang}}}
+
+\newrobustcmd*{\hyphenblockcquote}[1]{%
+  \csq@getccargs{\csq@bquote{\csq@hyph{#1}}{\csq@endhyph}}}
+
+\newrobustcmd*{\hybridblockcquote}[1]{%
+  \csq@getccargs{%
+    \csq@bquote
+      {\iftoggle{csq@block}{\csq@lang}{\csq@hyph}{#1}}
+      {\iftoggle{csq@block}{\csq@endlang}{\csq@endhyph}}}}
+
+% PDF strings
+
+\appto\csq@hook@hyperref{%
+  \def\blockquote{\pdfstringdefWarn\blockquote}%
+  \def\foreignblockquote{\pdfstringdefWarn\foreignblockquote}%
+  \def\hyphenblockquote{\pdfstringdefWarn\hyphenblockquote}%
+  \def\blockcquote{\pdfstringdefWarn\blockcquote}%
+  \def\foreignblockcquote{\pdfstringdefWarn\foreignblockcquote}%
+  \def\hyphenblockcquote{\pdfstringdefWarn\hyphenblockcquote}}
+
+% Display quotes
+
+\newenvironment*{displayquote}
+  {\csq@getcargs{\csq@bdquote{}{}}}
+  {\csq@edquote}
+
+% {}{}{}{}{}
+
+\def\csq@bdquote#1#2#3#4#5{%
+  \csuse{\csq@blockenvironment}%
+  \toggletrue{csq@block}%
+  \csq@setsfcodes
+  #1\ifblank{#4}
+    {\def\csq@tempb{\mkenddispquote{#5}{}#2}%
+     \mkbegdispquote{#5}{}}
+    {\def\csq@tempb{\mkenddispquote{#5}{\csq@switchlang{#3{#4}}}#2}%
+     \mkbegdispquote{#5}{\csq@switchlang{#3{#4}}}}%
+  \ignorespaces}
+
+\def\csq@edquote{%
+  \unspace\csq@tempb
+  \csuse{end\csq@blockenvironment}}
+
+\providerobustcmd*{\unspace}{%
+  \ifbool{hmode}
+    {\ifdimgreater\lastskip\z@
+       {\unskip\unspace}
+       {\ifnumgreater\lastpenalty\z@
+	  {\unpenalty\unspace}
+	  {}}}
+    {}}
+
+% {}{}
+
+\newcommand{\mkbegdispquote}[2]{}
+\newcommand{\mkenddispquote}[2]{#1#2}
+
+% Display quotes + language switching
+
+\newenvironment*{foreigndisplayquote}[1]
+  {\csq@getcargs{\csq@bdquote{\csq@lang{#1}}{\csq@endlang}}}
+  {\csq@edquote}
+
+\newenvironment*{hyphendisplayquote}[1]
+  {\csq@getcargs{\csq@bdquote{\csq@hyph{#1}}{\csq@endhyph}}}
+  {\csq@edquote}
+
+% Integrated display quotes
+
+\newenvironment*{displaycquote}
+  {\csq@getccargs{\csq@bdquote{}{}}}
+  {\csq@edquote}
+
+% Integrated display quotes + language switching
+
+\newenvironment*{foreigndisplaycquote}[1]
+  {\csq@getccargs{\csq@bdquote{\csq@lang{#1}}{\csq@endlang}}}
+  {\csq@edquote}
+
+\newenvironment*{hyphendisplaycquote}[1]
+  {\csq@getccargs{\csq@bdquote{\csq@hyph{#1}}{\csq@endhyph}}}
+  {\csq@edquote}
+
+% Hooks
+
+\newcommand{\mkcitation}[1]{\space(#1)}
+\newcommand{\mkccitation}[1]{\space#1}
+
+%% Markup with active characters
+
+\let\csq@dospecials\@empty
+\let\csq@doutfspecials\@empty
+
+\def\csq@do@dospecial#1#2{%
+  \ifnum\catcode`#1=\active
+    \csq@info{Redefining character \string#1}%
+    \csq@letspecial{#1}{csq@special@\number`#1}%
+  \else
+    \csq@info{Making character \string#1 active}%
+    \csq@letspecial{#1}{csq@special@\number`#1}%
+    \catcode`#1=\active
+  \fi}
+
+\def\csq@do@undospecial#1#2{%
+  \ifnum#2=\active
+    \csq@info{Resetting character \string#1}%
+    \csq@letspecial{#1}{csq@saved@\number`#1}%
+  \else
+    \csq@info{Resetting catcode of \string#1}%
+    \catcode`#1=#2\relax
+  \fi}
+
+\def\csq@do@verbspecial#1#2{%
+  \csq@info{Redefining character \string#1}%
+  \ifnum`#1<128\relax
+    \csq@edefspecial{#1}{\string#1}%
+  \else
+    \csq@letspecial{#1}{csq@saved@\number`#1}%
+  \fi}
+
+\def\csq@do@doutfspecial#1{%
+  \csq@info{Redefining character \csq@utfprint{#1}}%
+  \csletcs{u8:\csq@string{#1}}{csq@special@\csq@number{#1}}}
+
+\def\csq@do@undoutfspecial#1{%
+  \csq@info{Resetting character \csq@utfprint{#1}}%
+  \csletcs{u8:\csq@string{#1}}{csq@saved@\csq@number{#1}}}
+
+\def\csq@do@delspecial#1#2{%
+  \csq@info{Deallocating character \string#1}%
+  \csundef{csq@special@\number`#1}%
+  \csundef{csq@saved@\number`#1}%
+  \csundef{csq@string@\number`#1}%
+  \csundef{csq@textdef@\number`#1}%
+  \csundef{csq@xtxtdef@\number`#1}%
+  \csundef{csq@pdfdef@\number`#1}}
+
+\def\csq@do@delutfspecial#1{%
+  \csq@info{Deallocating character \csq@utfprint{#1}}%
+  \csundef{csq@special@\csq@number{#1}}%
+  \csundef{csq@saved@\csq@number{#1}}%
+  \csundef{csq@string@\csq@number{#1}}%
+  \csundef{csq@textdef@\csq@number{#1}}%
+  \csundef{csq@xtxtdef@\csq@number{#1}}%
+  \csundef{csq@pdfdef@\csq@number{#1}}}
+
+\def\csq@mkenable{%
+  \let\do\csq@do@dospecial
+  \csq@dospecials
+  \let\do\csq@do@doutfspecial
+  \csq@doutfspecials
+  \let\do\noexpand
+  \toggletrue{csq@active}}
+
+\def\csq@mkdisable{%
+  \iftoggle{csq@active}
+    {\let\do\csq@do@undospecial
+     \csq@dospecials
+     \let\do\csq@do@undoutfspecial
+     \csq@doutfspecials
+     \let\do\noexpand
+     \togglefalse{csq@active}}
+    {}}
+
+\def\csq@mkverbatim{%
+  \iftoggle{csq@active}
+    {\let\do\csq@do@verbspecial
+     \csq@dospecials
+     \let\do\csq@do@undoutfspecial
+     \csq@doutfspecials
+     \let\do\noexpand}
+    {}}
+
+\def\csq@mkdelete{%
+  \csq@mkdisable
+  \let\do\csq@do@delspecial
+  \csq@dospecials
+  \let\do\csq@do@delutfspecial
+  \csq@doutfspecials
+  \let\do\noexpand
+  \let\csq@dospecials\@empty
+  \let\csq@doutfspecials\@empty
+  \let\csq@mkpdfstrings\@empty}
+
+\let\csq@mkpdfstrings\@empty
+\appto\csq@hook@hyperref{\csq@mkpdfstrings}
+
+\ifdef\inpenc@prehook
+  {\AtBeginDocument{%
+     \addto@hook\inpenc@prehook{%
+        \csq@info{Input encoding change}%
+        \csq@mkdelete}}}
+  {}
+
+% Regular specials
+
+% {}{}{}{}
+
+\def\csq@addspecial#1#2#3#4{%
+  \csq@validate{#1}
+    {\csq@addspecial@i@s{#1}{\csqQQ}{#2}{#3}{#4}}
+    {\csq@addspecial@i@u{#1}{\csqQQ}{#2}{#3}{#4}}}
+
+% {}{}{}{}{}
+
+\def\csq@addspecial@i@s#1#2#3#4#5{%
+  \csq@info{Allocating character \string#1}%
+  \csedef{csq@special@\number`#1}{\noexpand#2{\number`#1}}%
+  \ifnum\catcode`#1=\active
+    \cslet{csq@saved@\number`#1}{#1}%
+  \else
+    \csdef{csq@saved@\number`#1}{#1}%
+  \fi
+  \csedef{csq@string@\number`#1}{\string#1}%
+  \csdef{csq@textdef@\number`#1}{#3}%
+  \ifblank{#5}
+    {\csdef{csq@pdfdef@\number`#1}{#4}}
+    {\appto\csq@mkpdfstrings{\csq@defpspecial{#1}{#4}{#5}}}%
+  \eappto\csq@dospecials{\noexpand\do{\string#1}{\the\catcode`#1}}%
+  \ifnum`#1<128\relax
+    \csq@addto@list{#1}{\dospecials}{\do}%
+    \csq@addto@list{#1}{\@sanitize}{\@makeother}%
+  \fi}
+
+% {}{}{}{}{}
+
+\def\csq@addspecial@i@u#1#2#3#4#5{%
+  \csq@info{Allocating character \csq@utfprint{#1}}%
+  \csedef{csq@special@\csq@number{#1}}{%
+    \noexpand#2{\csq@number{#1}}}%
+  \ifcsundef{u8:\csq@string{#1}}
+    {\csq@error
+       {\csq@utfprint{#1} not supported by inputenc}
+       {This UTF-8 sequence does not seem to be supported by the
+        inputenc\MessageBreak package}%
+     \csdef{csq@saved@\csq@number{#1}}{}}
+    {\csletcs{csq@saved@\csq@number{#1}}{u8:\csq@string{#1}}}%
+  \csedef{csq@string@\csq@number{#1}}{\csq@string{#1}}%
+  \csdef{csq@textdef@\csq@number{#1}}{#3}%
+  \ifblank{#5}
+    {\csdef{csq@pdfdef@\csq@number{#1}}{#4}}
+    {\appto\csq@mkpdfstrings{\csq@defupspecial{#1}{#4}{#5}}}%
+  \eappto\csq@doutfspecials{\noexpand\do{\csq@string{#1}}}}
+
+% Block specials
+
+% {}{}{}{}
+
+\def\csq@addbspecial#1#2#3#4{%
+  \csq@validate{#1}
+    {\csq@addbspecial@i@s{#1}{#2}{#3}{#4}}
+    {\csq@addbspecial@i@u{#1}{#2}{#3}{#4}}}
+
+\def\csq@addbspecial@i@s#1#2#3#4{%
+  \begingroup
+  \def\csq@tempa{\endgroup\csq@addspecial@i@s{#1}{\csqBQ}{}}%
+  \eappto\csq@tempa{%
+    {\expandafter\noexpand\csname csq@saved@\number`#1\endcsname
+     \noexpand\pdfstringdefWarn{\string#1}}{}}%
+  \csq@tempa
+  \csq@validate{#2}
+    {\csq@addbspecial@ii@s{\number`#1}{#2}{#3}{#4}}
+    {\csq@addbspecial@ii@u{\number`#1}{#2}{#3}{#4}}}
+
+\def\csq@addbspecial@i@u#1#2#3#4{%
+  \begingroup
+  \def\csq@tempa{\endgroup\csq@addspecial@i@u{#1}{\csqBQ}{}}%
+  \eappto\csq@tempa{%
+    {\expandafter\noexpand\csname csq@saved@\csq@number{#1}\endcsname
+     \noexpand\pdfstringdefWarn{\csq@utfprint{#1}}}{}}%
+  \csq@tempa
+  \csq@validate{#2}
+    {\csq@addbspecial@ii@s{\csq@number{#1}}{#2}{#3}{#4}}
+    {\csq@addbspecial@ii@u{\csq@number{#1}}{#2}{#3}{#4}}}
+
+\def\csq@addbspecial@ii@s#1#2#3#4{%
+  \csq@addspecial@i@s{#2}{\csqBQsep}{}{}{}%
+  \begingroup
+  \let\csq@tempa\@empty
+  \def\csq@tempb{{#1}}%
+  \uccode`\~=`#2\relax
+  \uppercase{\appto\csq@tempb{{~}}}%
+  \appto\csq@tempb{{#3}{#4}}%
+  \csq@validate{#3}
+    {\expandafter\def\expandafter\csq@tempa
+     \expandafter{\expandafter\csq@addbspecial@iii@s\csq@tempb}}
+    {\expandafter\def\expandafter\csq@tempa
+     \expandafter{\expandafter\csq@addbspecial@iii@u\csq@tempb}}%
+  \expandafter\endgroup\csq@tempa}
+
+\def\csq@addbspecial@ii@u#1#2#3#4{%
+  \csq@addspecial@i@u{#2}{\csqBQsep}{}{}{}%
+  \csq@validate{#3}
+    {\csq@addbspecial@iii@s{#1}{#2}{#3}{#4}}
+    {\csq@addbspecial@iii@u{#1}{#2}{#3}{#4}}}
+
+\def\csq@addbspecial@iii@s#1#2#3#4{%
+  \csq@addspecial@i@s{#3}{\csqBQend}{}{}{}%
+  \begingroup
+  \def\csq@tempa{{#1}{#2}}%
+  \uccode`\~=`#3\relax
+  \uppercase{\appto\csq@tempa{~}}%
+  \appto\csq@tempa{{#4}}%
+  \expandafter\endgroup
+  \expandafter\csq@addbspecial@iv\csq@tempa}
+
+\def\csq@addbspecial@iii@u#1#2#3#4{%
+  \csq@addspecial@i@u{#3}{\csqBQend}{}{}{}%
+  \csq@addbspecial@iv{#1}{#2}{#3}{#4}}
+
+\def\csq@addbspecial@iv#1#2#3#4{%
+  \expandafter\csq@defbspecial
+  \expandafter{\csname csq@textdef@#1\endcsname}{#2}{#3}{#4}%
+  \expandafter\csq@defxbspecial
+  \expandafter{\csname csq@xtxtdef@#1\endcsname}{#4}}
+
+% Specials
+
+\newcommand*{\csqQQ}[1]{%
+  \csq@ifsafeactives
+    {\csuse{csq@string@#1}}
+    {\csq@iftypeset
+       {\ifbool{mmode}
+          {\csuse{csq@saved@#1}}
+          {\csuse{csq@textdef@#1}}}
+       {\csq@ifstrings
+          {\csuse{csq@string@#1}}
+          {\noexpand\csqQQ{#1}}}}}
+
+\newcommand*{\csqBQ}[1]{%
+  \csq@ifsafeactives
+    {\csuse{csq@string@#1}}
+    {\csq@iftypeset
+       {\ifbool{mmode}
+          {\csuse{csq@saved@#1}}
+          {\csq@ifnested
+             {\csq@err@nbquote}
+             {\csq@nbgobble{\csuse{csq@textdef@#1}}}}}
+       {\csq@ifstrings
+          {\csuse{csq@string@#1}}
+          {\noexpand\csqBQbeg{#1}}}}}
+
+\newcommand*{\csqBQbeg}[1]{%
+  \csq@ifsafeactives
+    {\csuse{csq@string@#1}}
+    {\csq@iftypeset
+       {\ifbool{mmode}
+          {\csuse{csq@saved@#1}}
+          {\csq@ifnested
+             {\csq@err@nbquote}
+             {\csq@nbgobble{\csuse{csq@xtxtdef@#1}}}}}
+       {\csq@ifstrings
+          {\csuse{csq@string@#1}}
+          {\noexpand\csqBQbeg{#1}}}}}
+
+\newcommand*{\csqBQsep}[1]{%
+  \csq@ifsafeactives
+    {\csuse{csq@string@#1}}
+    {\csq@iftypeset
+       {\csuse{csq@saved@#1}}
+       {\csq@ifstrings
+          {\csuse{csq@string@#1}}
+          {\noexpand\csqBQsep{#1}}}}}
+
+\newcommand*{\csqBQend}[1]{%
+  \csq@ifsafeactives
+    {\csuse{csq@string@#1}}
+    {\csq@iftypeset
+       {\csuse{csq@saved@#1}}
+       {\csq@ifstrings
+          {\csuse{csq@string@#1}}
+          {\noexpand\csqBQend{#1}}}}}
+
+\appto\csq@hook@hyperref{%
+  \def\csqQQ#1{\csuse{csq@pdfdef@#1}}%
+  \def\csqBQ#1{\csuse{csq@pdfdef@#1}}%
+  \def\csqBQbeg#1{\csuse{csq@pdfdef@#1}}%
+  \def\csqBQsep#1{\csuse{csq@saved@#1}}%
+  \def\csqBQend#1{\csuse{csq@saved@#1}}}
+
+% Define specials
+
+% {}{}
+
+\def\csq@edefspecial#1#2{%
+  \begingroup
+  \uccode`\~=`#1\relax
+  \uppercase{\endgroup\edef~}{#2}}
+
+% {}{}
+
+\def\csq@letspecial#1#2{%
+  \begingroup
+  \uccode`\~=`#1\relax
+  \uppercase{\def\csq@tempa{\endgroup\let~}}%
+  \expandafter\csq@tempa\csname#2\endcsname}
+
+% {}{}{}{}
+
+\def\csq@defbspecial#1#2#3#4{%
+  \long\def#1##1#3{\csq@bspecial@i{##1}{#2}{#4}}}
+
+% {}{}{}
+
+\long\def\csq@bspecial@i#1#2#3{%
+  \long\def\csq@bspecial@ii##1#2##2&{%
+    \ifblank{##2}
+      {#3{}{}{#1}}
+      {\csq@bspecial@iii#1&}}%
+  \long\def\csq@bspecial@iii##1#2##2&{%
+    #3{##2}{}{##1}}%
+  \csq@bspecial@ii#1#2&}
+
+% {}{}
+
+\def\csq@defxbspecial#1#2{%
+  \long\def#1##1\csqBQend##2{\csq@xbspecial@i{##1}{#2}}}
+
+% {}{}
+
+\long\def\csq@xbspecial@i#1#2{%
+  \long\def\csq@xbspecial@ii##1\csqBQsep##2&{%
+    \ifblank{##2}
+      {#2{}{}{#1}}
+      {\csq@xbspecial@iii#1&}}%
+  \long\def\csq@xbspecial@iii##1\csqBQsep##2##3&{%
+    #2{##3}{}{##1}}%
+  \csq@xbspecial@ii#1\csqBQsep&}
+
+% {}{}{}
+
+\def\csq@defpspecial#1#2#3{%
+  \begingroup
+  \uccode`\~=`#1\relax
+  \uppercase{\endgroup\def~##1~}{#2##1#3}}
+
+% {}{}{}
+
+\def\csq@defupspecial#1#2#3{%
+  \expandafter\def\csname u8:\csq@string{#1}\endcsname##1#1{#2##1#3}}
+
+% Validate user input
+
+% {}{}{}
+
+\def\csq@validate#1#2#3{%
+  \csq@ifutfchar{#1}
+    {\csq@ifvalidutf{#1}
+       {\ifcsundef{csq@special@\csq@number{#1}}
+           {#3}
+           {\csq@err@alloc}}
+       {\csq@err@utf}}
+    {\csq@ifvalidchar{#1}
+       {\ifcsundef{csq@special@\number`#1}
+          {#2}
+          {\csq@err@alloc}}
+       {\csq@err@char}}}
+
+% {}{}{}
+
+\def\csq@ifutfchar#1{%
+  \ifundef\inputencodingname
+    {\@secondoftwo}
+    {\csq@ifutfenc}%
+  {\csq@ifsingle{#1}
+     {\ifnum`#1<128\relax
+        \expandafter\@secondoftwo
+      \else
+        \csq@err@utf
+        \expandafter\@gobbletwo
+      \fi}
+     {\@firstoftwo}}
+  {\csq@ifsingle{#1}
+     {\@secondoftwo}
+     {\csq@err@char
+      \@gobbletwo}}}
+
+\ifundef\inputencodingname
+  {\def\csq@ifutfenc{%
+     \csq@ifucs
+       {\csq@err@ucs\@secondoftwo}
+       {\begingroup
+        \def\@inpenc@undefined@##1{\def\inputencodingname{##1}}%
+        \@inpenc@undefined
+        \ifdefstring\inputencodingname{utf8}
+	  {\aftergroup\@firstoftwo}
+	  {\aftergroup\@secondoftwo}%
+        \endgroup}}}
+  {\def\csq@ifutfenc{%
+     \csq@ifucs
+       {\csq@err@ucs\@secondoftwo}
+       {\ifdefstring\inputencodingname{utf8}}}}
+
+% {}{}{}
+
+\long\def\csq@ifsingle#1{%
+  \ifblank{#1}
+    {\@secondoftwo}
+    {\expandafter\csq@ifsingle@i
+     \string#1&&\@secondoftwo\@firstoftwo:}}
+\long\def\csq@ifsingle@i#1#2#3#5#6:{#5}
+
+% {}{}{}
+
+\def\csq@ifvalidchar#1{%
+  \begingroup
+  \@tempswafalse
+  \ifnum\active=\catcode`#1\relax
+    \@tempswatrue
+  \else\ifnum12=\catcode`#1\relax
+    \@tempswatrue
+  \fi\fi
+  \if@tempswa
+    \csq@ifvalidchar@i{#1}%
+  \fi
+  \if@tempswa
+    \aftergroup\@firstoftwo
+  \else
+    \aftergroup\@secondoftwo
+  \fi
+  \endgroup}
+
+\def\csq@ifvalidchar@i#1{%
+  \def\break\fi##1\relax{\fi\@tempswafalse}%
+  \def\do##1{\ifnum`##1=`#1\relax\break\fi}%
+  \csq@resrvdchars\relax}
+
+\def\csq@resrvdchars{%
+  \do\[\do\]\do\*\do\@\do\~\do\-\do\`\do\'\do\.\do\,\do\;\do\:%
+  \do\!\do\?\do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9}
+
+% {}{}{}
+
+\def\csq@ifvalidutf#1{%
+  \ifblank{#1}{\@secondoftwo}{\csq@ifvalidutf@i#1&}}
+
+\def\csq@ifvalidutf@i#1#2&{%
+  \ifblank{#2}
+    {\@secondoftwo}% 0x00-0x7F handled elsewhere
+    {\csq@ifutfstart{#1}{\csq@ifvalidutf@ii#2&}{\@secondoftwo}}}
+
+\def\csq@ifvalidutf@ii#1#2&{%
+  \csq@ifutfnext{#1}
+    {\ifblank{#2}{\@firstoftwo}{\csq@ifvalidutf@ii#2&}}
+    {\@secondoftwo}}
+
+% 0xC0-0xFD, 0x80-0xBF, 0x80-0xBF, ...
+
+\def\csq@ifutfstart#1{%
+  \ifnum`#1>191\relax
+    \ifnum`#1<254\relax
+      \expandafter\expandafter
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\expandafter
+      \expandafter\@secondoftwo
+    \fi
+  \else
+    \expandafter\@secondoftwo
+  \fi}
+
+\def\csq@ifutfnext#1{%
+  \ifnum`#1>127\relax
+    \ifnum`#1<192\relax
+      \expandafter\expandafter
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\expandafter
+      \expandafter\@secondoftwo
+    \fi
+  \else
+    \expandafter\@secondoftwo
+  \fi}
+
+\def\csq@isvalid#1#2#3{#2}
+
+% User interface
+
+\newrobustcmd*{\MakeOuterQuote}[1]{%
+  \csq@addspecial{#1}{\csq@oqmark}
+    {\csq@pdf@ooqmark}{\csq@pdf@coqmark}}
+
+\newrobustcmd*{\MakeInnerQuote}[1]{%
+  \csq@addspecial{#1}{\csq@iqmark}
+    {\csq@pdf@oiqmark}{\csq@pdf@ciqmark}}
+
+\newrobustcmd*{\MakeAutoQuote}{%
+  \@ifstar
+    {\csq@mkaquote\csq@iqopen}
+    {\csq@mkaquote\csq@oqopen}}
+\def\csq@mkaquote#1#2#3{%
+  \csq@addspecial{#2}{#1}{\csq@pdf@ooqmark}{}%
+  \csq@addspecial{#3}{\csq@qclose}{\csq@pdf@coqmark}{}}
+
+\newrobustcmd*{\MakeForeignQuote}{%
+  \@ifstar
+    {\csq@mkfquote\csq@iqopen@i}
+    {\csq@mkfquote\csq@oqopen@i}}
+\def\csq@mkfquote#1#2#3#4{%
+  \csq@addspecial{#3}
+    {\csq@bqgroup\csq@lang{#2}#1}
+    {\csq@pdf@ooqmark}{}%
+  \csq@addspecial{#4}
+    {\csq@qclose@i{\csq@endlang}}
+    {\csq@pdf@coqmark}{}}
+
+\newrobustcmd*{\MakeHyphenQuote}{%
+  \@ifstar
+    {\csq@mkhquote\csq@iqopen@i}
+    {\csq@mkhquote\csq@oqopen@i}}
+\def\csq@mkhquote#1#2#3#4{%
+  \csq@addspecial{#3}
+    {\csq@bqgroup\csq@hyph{#2}#1}
+    {\csq@pdf@ooqmark}{}%
+  \csq@addspecial{#4}
+    {\csq@qclose@i{\csq@endhyph}}
+    {\csq@pdf@coqmark}{}}
+
+\newrobustcmd*{\MakeBlockQuote}[3]{%
+  \csq@addbspecial{#1}{#2}{#3}{\csq@bquote{}{}{\mkcitation}}}
+
+\newrobustcmd*{\MakeForeignBlockQuote}[4]{%
+  \csq@addbspecial{#2}{#3}{#4}%
+    {\csq@bquote{\csq@lang{#1}}{\csq@endlang}{\mkcitation}}}
+
+\newrobustcmd*{\MakeHyphenBlockQuote}[4]{%
+  \csq@addbspecial{#2}{#3}{#4}%
+    {\csq@bquote{\csq@hyph{#1}}{\csq@endhyph}{\mkcitation}}}
+
+\newrobustcmd*{\MakeHybridBlockQuote}[4]{%
+  \csq@addbspecial{#2}{#3}{#4}%
+    {\csq@bquote
+       {\iftoggle{csq@block}{\csq@lang}{\csq@hyph}{#1}}
+       {\iftoggle{csq@block}{\csq@endlang}{\csq@endhyph}}
+       {\mkcitation}}}
+
+\newrobustcmd*{\EnableQuotes}{}
+\newrobustcmd*{\DisableQuotes}{}
+\newrobustcmd*{\VerbatimQuotes}{}
+\newrobustcmd*{\DeleteQuotes}{\csq@mkdelete}
+
+\AtBeginDocument{%
+  \protected\def\EnableQuotes{\csq@mkenable}%
+  \protected\def\DisableQuotes{\csq@mkdisable}%
+  \protected\def\VerbatimQuotes{\csq@mkverbatim}}
+
+% Author interface
+
+\newrobustcmd*{\@enablequotes}{%
+  \toggletrue{csq@quiet}%
+  \csq@mkenable
+  \togglefalse{csq@quiet}}
+\newrobustcmd*{\@disablequotes}{%
+  \toggletrue{csq@quiet}%
+  \csq@mkdisable
+  \togglefalse{csq@quiet}}
+\newrobustcmd*{\@verbatimquotes}{%
+  \toggletrue{csq@quiet}%
+  \csq@mkverbatim
+  \togglefalse{csq@quiet}}
+\newrobustcmd*{\@deletequotes}{%
+  \toggletrue{csq@quiet}%
+  \csq@mkdelete
+  \togglefalse{csq@quiet}}
+
+%% Switch quote styles manually
+
+\newrobustcmd*{\setquotestyle}{%
+  \@ifstar
+    {\csq@resetqstyle}
+    {\@ifnextchar[%]
+       {\csq@setqstyle}
+       {\csq@setqstyle[]}}}
+
+\def\csq@setqstyle[#1]#2{%
+  \ifnum\csq@reset>\z@
+    \csq@info{Disabling multilingual quotes}%
+    \csq@reset\z@
+  \fi
+  \ifblank{#1}
+    {\DeclareQuoteAlias{#2}{default}}
+    {\DeclareQuoteAlias{#2/#1}{default}}}
+
+\def\csq@resetqstyle{%
+  \csq@info{Enabling multilingual quotes}%
+  \csq@reset\@ne}
+
+\AtEndPreamble{%
+  \def\csq@setqstyle[#1]#2{%
+    \ifnum\csq@reset=\@ne
+      \csq@info{Disabling multilingual quotes}%
+      \csq@reset\z@
+    \fi
+    \ifblank{#1}
+      {\csq@setstyle{#2}}
+      {\csq@setstyle{#2/#1}}}}
+
+%% Define quote styles
+
+\newrobustcmd*{\DeclareQuoteStyle}[2][]{%
+  \begingroup
+  \let\if@safe@actives\iftrue
+  \ifblank{#1}
+    {\edef\csq@tempa{#2}}
+    {\edef\csq@tempa{#2/#1}}%
+  \ifcsundef{csq@qstyle@\csq@tempa}
+    {}
+    {\csq@info{Redefining quotation style '\csq@tempa'}}%
+  \@ifnextchar[%]
+    {\csq@declareqstyle@i}
+    {\csq@declareqstyle@i[]}}
+
+\def\csq@declareqstyle@i[#1]{%
+  \csgdef{csq@qstyle@\csq@tempa}{%
+    \def\csq@thequote@oinit{%
+      \let\csq@themarker\csq@kernmarker#1}}%
+  \@ifnextchar[%]
+    {\csq@declareqstyle@ii}
+    {\csq@declareqstyle@ii[]}}
+
+\def\csq@declareqstyle@ii[#1]#2{%
+  \csgappto{csq@qstyle@\csq@tempa}{%
+    \def\csq@thequote@iinit{#1}%
+    \def\csq@thequote@oopen{#2}}%
+  \@ifnextchar[%]
+    {\csq@declareqstyle@iii}
+    {\csq@declareqstyle@iii[]}}
+
+\def\csq@declareqstyle@iii[#1]#2{%
+  \csgappto{csq@qstyle@\csq@tempa}{%
+    \def\csq@thequote@omiddle{#1}%
+    \def\csq@thequote@oclose{#2}}%
+  \@ifnextchar[%]
+    {\csq@declareqstyle@iv}
+    {\csq@declareqstyle@iv[]}}
+
+\def\csq@declareqstyle@iv[#1]#2{%
+  \ifblank{#1}
+    {\def\csq@thequote@kern{\z@}}
+    {\def\csq@thequote@kern{#1}}%
+  \csxappto{csq@qstyle@\csq@tempa}{%
+    \def\noexpand\csq@thequote@kern{\csq@thequote@kern}}%
+  \csgappto{csq@qstyle@\csq@tempa}{%
+    \def\csq@thequote@iopen{#2}}%
+  \@ifnextchar[%]
+    {\csq@declareqstyle@v}
+    {\csq@declareqstyle@v[]}}
+
+\def\csq@declareqstyle@v[#1]#2{%
+  \csgappto{csq@qstyle@\csq@tempa}{%
+    \def\csq@thequote@imiddle{#1}%
+    \def\csq@thequote@iclose{#2}}%
+  \endgroup}
+
+\@onlypreamble\DeclareQuoteStyle
+
+%% Define quote aliases
+
+\newrobustcmd*{\DeclareQuoteAlias}[3][]{%
+  \begingroup
+  \let\if@safe@actives\iftrue
+  \ifblank{#1}
+    {\edef\csq@tempa{#2}}
+    {\edef\csq@tempa{#2/#1}}%
+  \ifcsundef{csq@qstyle@\csq@tempa}
+    {\csq@error
+       {Quote style not defined}
+       {Define the style or alias '\csq@tempa' first}}
+    {\ifcsundef{csq@qstyle@#3}
+       {}
+       {\csq@info{Redefining alias '#3' -> '\csq@tempa'}}%
+     \csxdef{csq@qstyle@#3}{%
+       \noexpand\csuse{csq@qstyle@\csq@tempa}}}%
+  \endgroup}
+
+\@onlypreamble\DeclareQuoteAlias
+
+%% Define quotes for PDF strings
+
+\newrobustcmd*{\DeclarePlainStyle}[4]{%
+  \def\csq@pdf@ooqmark{#1}%
+  \def\csq@pdf@coqmark{#2}%
+  \def\csq@pdf@oiqmark{#3}%
+  \def\csq@pdf@ciqmark{#4}}
+
+\@onlypreamble\DeclarePlainStyle
+
+%% Define package options
+
+\newrobustcmd*{\DeclareQuoteOption}[1]{%
+  \define@key{csq}{#1}{\DeclareQuoteAlias[##1]{#1}{#1}}}
+
+\AtEndOfPackage{%
+  \protected\def\DeclareQuoteOption#1{%
+    \csq@warn@location\DeclareQuoteOption}}
+
+%% Space factor codes
+
+\newrobustcmd*{\DeclareQuoteGlyph}[2]{%
+  \csxappto{csq@sfcodes@#1}{\sfcode\detokenize{#2}=\z@}}
+
+%% Set defaults
+
+\newrobustcmd*{\SetBlockThreshold}[1]{%
+  \csq@tshold=#1\relax}
+
+\newrobustcmd*{\SetBlockEnvironment}[1]{%
+  \ifcsundef{#1}
+    {\csq@err@undef{#1}}
+    {\def\csq@blockenvironment{#1}}}
+
+\newrobustcmd*{\SetCiteCommand}[1]{%
+  \ifundef#1%
+    {\csq@err@undef{#1}}
+    {\def\csq@cite{#1}}}
+
+%% Interface for biblatex
+
+\newrobustcmd*{\@setquotesfcodes}{\csq@setsfcodes}
+
+\newcommand*{\@quotelevel}{}
+\let\@quotelevel\csq@qlevel
+
+\newcommand*{\@quotereset}{}
+\let\@quotereset\csq@reset
+
+\newcommand*{\@ifquotemarker}{%
+  \ifdim\lastskip=\csq@kernmarker\relax
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi}
+
+%% Author interface to auto quotes
+
+\newrobustcmd*{\openautoquote}{%
+  \ifbool{mmode}
+    {\csq@err@mmode\openautoquote}
+    {\csq@oqopen}}
+
+\newrobustcmd*{\closeautoquote}{%
+  \ifbool{mmode}
+    {\csq@err@mmode\closeautoquote}
+    {\csq@qclose}}
+
+\newrobustcmd*{\openinnerquote}{%
+  \ifbool{mmode}
+    {\csq@err@mmode\openinnerquote}
+    {\csq@iqopen}}
+
+\newrobustcmd*{\closeinnerquote}{%
+  \ifbool{mmode}
+    {\csq@err@mmode\closeinnerquote}
+    {\csq@qclose}}
+
+\appto\csq@hook@hyperref{%
+  \def\openautoquote{\csq@pdf@ooqmark}%
+  \def\closeautoquote{\csq@pdf@coqmark}%
+  \def\openinnerquote{\csq@pdf@oiqmark}%
+  \def\closeinnerquote{\csq@pdf@ciqmark}}
+
+%% Author interface to internal marks 
+
+\newrobustcmd*{\initoquote}{%
+  \csq@resetstyle
+  \csq@qlevel\@ne
+  \csq@init}
+
+\newrobustcmd*{\initiquote}{%
+  \csq@resetstyle
+  \csq@qlevel\tw@
+  \csq@init}
+
+\newrobustcmd*{\textooquote}{%
+  \csq@resetstyle
+  \csq@addkern@open
+  \let\csq@kernchar@i\csq@thequote@oopen
+  \csq@thequote@oopen
+  \csq@setmarker@open
+  \csq@fixkern}
+
+\newrobustcmd*{\textmoquote}{%
+  \csq@resetstyle
+  \csq@thequote@omiddle}
+
+\newrobustcmd*{\textcoquote}{%
+  \ifdim\lastkern=\csq@omitmarker
+  \else
+    \csq@resetstyle
+    \csq@addkern@close
+    \csq@thequote@oclose
+    \let\csq@kernchar@i\csq@thequote@oclose
+    \csq@setmarker@close
+    \expandafter\csq@fixkern
+  \fi}
+
+\newrobustcmd*{\textoiquote}{%
+  \csq@resetstyle
+  \csq@addkern@open
+  \let\csq@kernchar@i\csq@thequote@iopen
+  \csq@thequote@iopen
+  \csq@setmarker@open
+  \csq@fixkern}
+
+\newrobustcmd*{\textmiquote}{%
+  \csq@resetstyle
+  \csq@thequote@imiddle}
+
+\newrobustcmd*{\textciquote}{%
+  \ifdim\lastkern=\csq@omitmarker
+  \else
+    \csq@resetstyle
+    \csq@addkern@close
+    \csq@thequote@iclose
+    \let\csq@kernchar@i\csq@thequote@iclose
+    \csq@setmarker@close
+    \expandafter\csq@fixkern
+  \fi}
+
+%% Ellipses
+
+\newrobustcmd*{\textelp}{%
+  \begingroup
+  \@ifstar
+    {\@tempswatrue\csq@textelp}
+    {\@tempswafalse\csq@textelp}}
+
+\long\def\csq@textelp#1{%
+  \ifblank{#1}
+    {\endgroup\mktextelp}
+    {\expandafter\endgroup\if@tempswa
+       \expandafter\mktextinselp
+     \else
+       \expandafter\mktextelpins
+     \fi
+     {#1}}}
+
+\newrobustcmd*{\textins}{%
+  \@ifstar\mktextmod\mktextins}
+
+\newrobustcmd*{\textdel}{%
+  \mktextdel}
+
+\newcommand{\mktextelp}{[\textellipsis\unkern]}
+\newcommand{\mktextelpins}[1]{[\textellipsis\unkern] [#1]}
+\newcommand{\mktextinselp}[1]{[#1] [\textellipsis\unkern]}
+\newcommand{\mktextins}[1]{[#1]}
+\newcommand{\mktextmod}[1]{[#1]}
+\newcommand{\mktextdel}[1]{[]}
+
+%% Auxiliary commands for some styles
+
+% French
+
+\newrobustcmd*{\initfrenchquotes}{%
+  \let\csq@themarker\csq@omitmarker}
+
+\newrobustcmd*{\mkfrenchopenquote}[1]{%
+  \leavevmode#1\@frenchquotespace}
+
+\newrobustcmd*{\mkfrenchclosequote}[1]{%
+  \leavevmode\@frenchquotespace#1}
+
+\newcommand*{\@frenchquotespace}{%
+  \penalty\@M
+  \hskip 0.8\fontdimen2\font
+   plus  0.3\fontdimen3\font
+   minus 0.3\fontdimen4\font}
+
+\AtEndPreamble{%
+  \@ifpackageloaded{polyglossia}
+    {\@ifpackagelater{polyglossia}{2009/11/20}
+       {\let\@frenchquotespace\@empty}
+       {}}
+    {}}
+
+% German
+
+\newrobustcmd*{\fixligatures}{%
+  \ifhmode
+    \ifnum\spacefactor>3000
+      \kern0pt
+    \else
+      \ifnum\spacefactor=1007
+        \kern0pt
+      \else
+        \ifnum\spacefactor=1008
+          \kern0pt
+        \fi
+      \fi
+    \fi
+  \fi}
+
+% Special styles
+
+\DeclareQuoteStyle{debug}
+  {\textbf{[\number\@quotelevel]}}
+  [\textbf{[\number\@quotelevel]}]
+  {\textbf{[\number\@quotelevel]}}
+  {\textbf{[\number\@quotelevel]}}
+  [\textbf{[\number\@quotelevel]}]
+  {\textbf{[\number\@quotelevel]}}
+
+\DeclareQuoteStyle{fallback}
+  {\textbf{?}}
+  {\textbf{?}}
+  {\textbf{?}}
+  {\textbf{?}}
+
+%% Package options
+
+\newrobustcmd*{\ExecuteQuoteOptions}{\setkeys{csq}}
+\@onlypreamble\ExecuteQuoteOptions
+
+% Core options
+
+\define@key{csq}{strict}[true]{%
+  \ifstrequal{#1}{true}
+    {\csq@info{Enabling strict warnings}%
+     \let\csq@warnorerr\csq@warning@strict}
+    {\csq@info{Disabling strict warnings}%
+     \let\csq@warnorerr\csq@warning@loose}}
+
+\define@key{csq}{debug}[true]{%
+  \ifstrequal{#1}{true}
+    {\let\csq@debug\csq@logdebug}
+    {\let\csq@debug\@gobble}}
+
+\define@key{csq}{autopunct}[true]{%
+  \ifstrequal{#1}{true}
+    {\let\csq@autopunct\csq@allpunct}
+    {\let\csq@autopunct\@empty}}
+
+\define@key{csq}{style}{%
+  \csq@opt@autostyle@false
+  \DeclareQuoteAlias{#1}{default}}
+
+\define@key{csq}{autostyle}[true]{%
+  \ifcsdef{csq@opt@autostyle@#1}
+    {\csuse{csq@opt@autostyle@#1}}
+    {\csq@err@opt{autostyle=#1}}}
+\def\csq@opt@autostyle@false{%
+  \csq@info{Disabling multilingual quotes}%
+  \csq@reset\z@}
+\def\csq@opt@autostyle@true{%
+  \csq@info{Enabling multilingual quotes}%
+  \csq@reset\@ne}
+\def\csq@opt@autostyle@try{%
+  \csq@reset\tw@}
+\def\csq@opt@autostyle@once{%
+  \csq@reset\thr@@}
+\def\csq@opt@autostyle@tryonce{%
+  \csq@reset4\relax}
+
+\define@key{csq}{babel}[true]{%
+  \csq@info{%
+    Option 'babel' depreciated.\MessageBreak
+    Using 'autostyle'}%
+  \setkeys{csq}{autostyle=#1}}
+
+\define@key{csq}{maxlevel}{%
+  \ifnumless{#1}\tw@
+    {\csq@err@opt{maxlevel=#1}}
+    {\csq@maxlvl#1\relax}}
+
+\define@key{csq}{threshold}{%
+  \SetBlockThreshold{#1}}
+
+\define@key{csq}{thresholdtype}[lines]{%
+  \ifcsdef{csq@bcount@#1}%
+    {\def\csq@thresholdtype{#1}}
+    {\csq@err@opt{thresholdtype=#1}}}
+
+\define@key{csq}{parthreshold}[true]{%
+  \settoggle{csq@parthreshold}{#1}}
+
+\define@key{csq}{splitcomp}[true]{%
+  \ifstrequal{#1}{true}
+    {\let\csq@splitcomp\z@}
+    {\let\csq@splitcomp\@M}}
+
+\define@key{csq}{csdisplay}[true]{%
+  \setbool{csdisplay}{#1}}
+
+\define@key{csq}{version}{%
+  \ifdef\csq@getversion
+    {}
+    {\input{csq-compat.def}}%
+  \csq@getversion{#1}}
+
+% Initialize
+
+\setkeys{csq}{thresholdtype=lines,parthreshold,splitcomp=false}
+
+%% Initial setup
+
+% Provide 'quote' environment
+
+\ifundef\quote
+  {\csq@info{%
+     The 'quote' environment appears to be undefined.\MessageBreak
+     I'm defining a typical 'quote' environment now}
+   \def\quote{%
+     \list{}{\rightmargin\leftmargin}%
+     \item\relax}
+   \def\endquote{\endlist}}
+  {}
+
+% Deferred last minute setup
+
+\AtEndPreamble{%
+  \ifnumgreater\csq@reset\z@
+    {\csq@info{Checking for multilingual support..}%
+     \@ifpackageloaded{polyglossia}
+       {\csq@info{... found 'polyglossia' package}%
+	\def\csq@main@language{\xpg@main@language}%
+	\csq@hook@multilang}
+       {\@ifpackageloaded{babel}
+	  {\csq@info{... found 'babel' package}%
+           \def\csq@main@language{\bbl@main@language}%
+           \csq@hook@multilang}
+	  {\csq@info{... none found}%
+           \csq@hook@nomultilang}}}
+    {\@ifpackageloaded{polyglossia}
+       {}
+       {\@ifpackageloaded{babel}
+	  {}
+	  {\csq@hook@nomultilang}}}%
+  \undef\csq@hook@multilang
+  \undef\csq@hook@nomultilang
+  \@ifpackageloaded{hyperref}
+    {\expandafter\pdfstringdefDisableCommands
+     \expandafter{\csq@hook@hyperref}}
+    {}%
+  \undef\csq@hook@hyperref
+  \appto\@noligs{\@verbatimquotes}%
+  \@ifpackageloaded{verbatim}
+    {\addto@hook\every@verbatim{\@verbatimquotes}}
+    {}%
+  \@ifpackageloaded{fancyvrb}
+    {\appto\FV@CatCodes{\@verbatimquotes}}
+    {}%
+  \@ifpackageloaded{endnotes}
+    {\BlockquoteDisable{%
+       \renewcommand{\endnote}[2][]{%
+         \ifblank{#1}
+           {\endnotemark\relax}
+           {\endnotemark[#1]}}%
+       \renewcommand{\endnotetext}[2][]{}%
+       \let\addtoendnotes\@gobble}}
+    {}%
+  \ifdef\collect@body % amsmath
+    {\pretocmd\collect@body{\@disablequotes}
+       {}
+       {\csq@err@patch{'amsmath' package}}}
+    {}}
+
+\AtBeginDocument{%
+  \csq@setstyle{default}%
+  \csq@mkenable}
+
+% Restore catcodes
+
+\csq@catcodes
+\undef\csq@catcodes
+
+% Load predefined styles
+
+\input{csquotes.def}
+
+% Load configuration file
+
+\csq@info{Trying to load configuration file 'csquotes.cfg'..}
+\InputIfFileExists{csquotes.cfg}
+  {\csq@info{... configuration file loaded successfully}}
+  {\csq@info{... configuration file not used}}
+
+% Process options
+
+\DeclareOption*{%
+  \begingroup
+  \edef\csq@tempa{\endgroup
+    \noexpand\setkeys{csq}{\CurrentOption}}%
+  \csq@tempa}
+
+\ProcessOptions*
+
+\endinput
-- 
cgit v1.2.3