summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/csquotes
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-07-12 22:29:34 +0000
committerKarl Berry <karl@freefriends.org>2006-07-12 22:29:34 +0000
commitdb62fe150395d9bc65e20ba0d51042f201e2a4bc (patch)
tree360a31418fe9b5ef57d3f777c678b750ceb29207 /Master/texmf-dist/tex/latex/csquotes
parenta4f3458a22ca0198a289e764fb0447104be8ddb7 (diff)
csquotes 3.4
git-svn-id: svn://tug.org/texlive/trunk@1825 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/csquotes')
-rw-r--r--Master/texmf-dist/tex/latex/csquotes/csquotes.cfg13
-rw-r--r--Master/texmf-dist/tex/latex/csquotes/csquotes.sty1605
2 files changed, 926 insertions, 692 deletions
diff --git a/Master/texmf-dist/tex/latex/csquotes/csquotes.cfg b/Master/texmf-dist/tex/latex/csquotes/csquotes.cfg
index 179af4b8a96..a88047f604d 100644
--- a/Master/texmf-dist/tex/latex/csquotes/csquotes.cfg
+++ b/Master/texmf-dist/tex/latex/csquotes/csquotes.cfg
@@ -1,6 +1,6 @@
-% $Id: csquotes.cfg,v 3.1 2005/08/29 18:07:39 lehman pub $
+% $Id: csquotes.cfg,v 3.4 2006/04/02 15:58:08 lehman stable $
-\ProvidesFile{csquotes.cfg}[2005/08/29 v3.1 csquotes configuration]
+\ProvidesFile{csquotes.cfg}[2006/04/02 v3.4 Quotation configuration]
% Put your definitions here.
@@ -11,16 +11,15 @@
% you want to try them out.
% PRESETTING PACKAGE OPTIONS
-%
-% Use \ExecuteOptions to preset package options if you are not
+
+% Use \ExecuteQuoteOptions to preset package options if you are not
% satisfied with the built-in defaults. Options given here will be
% processed before any options specified in the document preamble.
-% You may override them anytime with \usepackage in the preamble.
-\ExecuteOptions{babel=true,strict=true}
+\ExecuteQuoteOptions{babel=once,strict=true}
% CHANGING THE DEFAULT PARAMETERS
-%
+
% All preset values may be changed in the document preamble as
% usual. The following values are the built-in defaults:
diff --git a/Master/texmf-dist/tex/latex/csquotes/csquotes.sty b/Master/texmf-dist/tex/latex/csquotes/csquotes.sty
index 55122288785..0cb999d5862 100644
--- a/Master/texmf-dist/tex/latex/csquotes/csquotes.sty
+++ b/Master/texmf-dist/tex/latex/csquotes/csquotes.sty
@@ -1,35 +1,50 @@
-% $Id: csquotes.sty,v 3.1 2005/08/29 18:07:39 lehman pub $
-%
-% Copyright (c) 2003--2005 Philipp Lehman, author-maintained.
+% $Id: csquotes.sty,v 3.4 2006/04/02 15:58:08 lehman stable $
+
+% Copyright (c) 2003--2006 Philipp Lehman, author-maintained.
%
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License
% (LPPL), version 1.3.
%
-% This software is provided 'as is', without warranty of any kind,
+% 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}
-\ProvidesPackage{csquotes}[2005/08/29 v3.1 quotation facilities]
+\ProvidesPackage{csquotes}[2006/04/02 v3.4 Quotation facilities]
\RequirePackage{keyval}
+%% Category codes
+
+\def\csq@docatcodes{\do\~\do\&\do\:\do\"}
+\def\do#1{\noexpand\do\noexpand#1{\the\catcode`#1}}
+\edef\csq@docatcodes{\csq@docatcodes}
+
+\AtEndOfPackage{%
+ \def\do#1#2{\catcode`#1=#2\relax}
+ \csq@docatcodes
+ \let\csq@docatcodes\@undefined
+ \let\do\noexpand}
+
+\catcode`\~=\active
+\catcode`\&=3 % three
+\catcode`\:=12
+\catcode`\"=12
+
%% General things
-\newif\ifcsq@reset
\newif\ifcsq@block
\newif\ifcsq@quiet
-\newif\ifcsq@strict
+\newif\ifcsq@reset
+\newif\ifcsq@ronce
\newif\ifcsq@active
-\newcount\csq@qlevel
-\newcount\csq@glevel
\newcount\csq@gtype
+\newcount\csq@glevel
+\newcount\csq@qlevel
\newcount\csq@lastsf
-\newcount\csq@threshold
-
-\newtoks\csq@ltxeverypar
+\newcount\csq@tshold
\def\csq@ifcsundefined#1{%
\begingroup
@@ -43,29 +58,26 @@
\begingroup
\escapechar\m@ne
\expandafter\csq@ifcsundefined
- \expandafter{\string #1}
+ \expandafter{\string#1}
{\endgroup\@firstoftwo}
{\endgroup\@secondoftwo}}
-\csq@ifcsundefined{eTeXversion}
- {\let\csq@ifetex\@secondoftwo}
- {\let\csq@ifetex\@firstoftwo}
+\providecommand{\@gobblethree}[3]{}
+\providecommand{\@gobblefive}[5]{}
% Hook management (and some syntactic sugar)
\long\def\csq@add#1#2{%
\csq@ifundefined{#1}{\let#1\@empty}{}%
\begingroup
- \toks@=\expandafter{#1#2}%
- \edef#1{\endgroup\def\noexpand#1{\the\toks@}}%
- #1}
+ \toks@=\expandafter{#1#2}%
+ \edef#1{\endgroup\def\noexpand#1{\the\toks@}}#1}
\long\def\csq@eadd#1#2{%
\csq@ifundefined{#1}{\let#1\@empty}{}%
\begingroup
- \toks@=\expandafter{#1}%
- \edef#1{\endgroup\def\noexpand#1{\the\toks@#2}}%
- #1}
+ \toks@=\expandafter{#1}%
+ \edef#1{\endgroup\def\noexpand#1{\the\toks@#2}}#1}
\long\def\csq@gadd#1{%
\csq@ifundefined{#1}{\let#1\@empty}{}%
@@ -74,19 +86,26 @@
\long\def\csq@xadd#1#2{%
\csq@ifundefined{#1}{\let#1\@empty}{}%
\begingroup
- \toks@=\expandafter{#1}%
- \xdef#1{\the\toks@#2}%
+ \toks@=\expandafter{#1}%
+ \xdef#1{\the\toks@#2}%
\endgroup}
-\def\csq@csgdef#1{\expandafter\gdef\csname #1\endcsname}
-\def\csq@csxdef#1{\expandafter\xdef\csname #1\endcsname}
-\def\csq@csgadd#1{\expandafter\csq@gadd\csname #1\endcsname}
-\def\csq@csxadd#1{\expandafter\csq@xadd\csname #1\endcsname}
+\def\csq@csdef#1{\expandafter\def\csname#1\endcsname}
+\def\csq@csedef#1{\expandafter\edef\csname#1\endcsname}
+\def\csq@csgdef#1{\expandafter\gdef\csname#1\endcsname}
+\def\csq@csxdef#1{\expandafter\xdef\csname#1\endcsname}
+\def\csq@csgadd#1{\expandafter\csq@gadd\csname#1\endcsname}
+\def\csq@csxadd#1{\expandafter\csq@xadd\csname#1\endcsname}
+
+\def\csq@cslet#1#2{\expandafter\let\csname#1\endcsname#2}
+\def\csq@letcs#1#2{\expandafter\let\expandafter#1\csname#2\endcsname}
+\def\csq@csletcs#1{\expandafter\csq@letcs\csname#1\endcsname}
-\def\csq@addto@dolist#1{%
- \expandafter\csq@addto@dolist@i\csname\string #1\endcsname}
+% {<item>}{<list>}{<separator>}
-\def\csq@addto@dolist@i#1#2#3{%
+\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%
@@ -94,28 +113,19 @@
\csq@add#2{#3#1}%
\fi}
+\newtoks\csq@ltxeverypar
\def\csq@addto@everypar#1{%
\let\csq@everypar\everypar
\csq@ltxeverypar=\expandafter{\the\everypar}%
- \csq@everypar={\the\csq@ltxeverypar #1}%
+ \csq@everypar={\the\csq@ltxeverypar#1}%
\let\everypar\csq@ltxeverypar
\let\csq@addto@everypar\@gobble}
-% Miscellaneous things
-
-\begingroup
- \catcode`\&=3
-
- \long\gdef\csq@ifblank#1{% by D. Arseneau
- \csq@ifblank@i#1&&\@secondoftwo\@firstoftwo&}%
- \long\gdef\csq@ifblank@i#1#2&#3#4#5&{#4}
+% Miscellaneous tests
- \long\gdef\csq@ifsingle#1{\csq@ifblank@i#1&&{\expandafter
- \csq@ifsingle@i\string #1&&\@secondoftwo\@firstoftwo&}%
- \@secondoftwo&}%
- \long\gdef\csq@ifsingle@i#1#2#3&#4#5#6&{#5}
-
-\endgroup
+\long\def\csq@ifblank#1{% by D. Arseneau
+ \csq@ifblank@i#1&&\@secondoftwo\@firstoftwo:}
+\long\def\csq@ifblank@i#1#2&#3#4#5:{#4}
\newcommand*{\ifstringblank}{\csq@ifblank}
\newcommand*{\ifblockquote}{%
@@ -125,6 +135,27 @@
\expandafter\@secondoftwo
\fi}
+\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@ifmmode{%
\ifmmode
\expandafter\@firstoftwo
@@ -132,47 +163,75 @@
\expandafter\@secondoftwo
\fi}
-\csq@ifetex
+\def\csq@ifnested{%
+ \ifcsq@block
+ \expandafter\@firstoftwo
+ \else
+ \ifnum\csq@qlevel>\z@
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
+ \fi
+ \fi}
+
+% Parsers for UTF-8
+
+\def\csq@string#1{\csq@string@i#1&}
+\def\csq@string@i#1#2&{%
+ \string#1\csq@ifblank{#2}{}{\csq@string@i#2&}}
+
+\def\csq@number#1{\csq@number@i#1&}
+\def\csq@number@i#1#2&{%
+ \number`#1 \csq@ifblank{#2}{}{.\csq@number@i#2&}}
+
+\def\csq@utfprint#1{u8:\csq@utfprint@i#1&}
+\def\csq@utfprint@i#1#2&{%
+ \number`#1 \csq@ifblank{#2}{}{:\csq@utfprint@i#2&}}
+
+% Grouping control
+
+\csq@ifcsundefined{eTeXversion}
+ {\let\csq@bqgroup\begingroup
+ \let\csq@eqgroup\endgroup}
{\def\csq@bqgroup{%
\bgroup\leavevmode
\csq@glevel\currentgrouplevel
\csq@gtype\currentgrouptype}
\def\csq@eqgroup{%
- \ifnum\csq@glevel=\currentgrouplevel
- \ifnum\csq@gtype=\currentgrouptype
+ \ifnum\csq@gtype=\currentgrouptype
+ \ifnum\csq@glevel=\currentgrouplevel
\else
- \csq@err@mismatch{%
- I have detected a group type mismatch. Verify that all
+ \csq@err@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 the level and type of all previously\MessageBreak
- opened groups to the transcript file}%
- \aftergroup\showgroups
+ balanced and nested. If you\MessageBreak continue, I
+ will write a summary of all previously opened
+ groups\MessageBreak to the transcript file}%
+ \aftergroup\showgroups
\fi
\else
\csq@err@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 the level and type of all previously\MessageBreak
- opened groups to the transcript file}%
+ 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}%
\aftergroup\showgroups
\fi
\egroup}}
- {\let\csq@bqgroup\begingroup
- \let\csq@eqgroup\endgroup}
%% User feedback
\def\csq@error#1#2{%
\PackageError{csquotes}{#1}{#2.}}
-\def\csq@warning#1#2#3#4{%
- \ifcsq@strict
- \PackageError{csquotes}{#3}{#4.}%
- \else
- \PackageWarning{csquotes}{#1.\MessageBreak #2}%
- \fi}
+\def\csq@warning@loose#1#2#3{%
+ \PackageWarning{csquotes}{#1}}
+\def\csq@warning@strict#1#2#3{%
+ \PackageError{csquotes}{#2}{#3.}}
+\let\csq@warning\csq@warning@loose
\def\csq@info#1{%
\ifcsq@quiet
@@ -193,68 +252,88 @@
\def\csq@err@mmode#1{%
\csq@error
- {Command `\string #1' invalid in math mode}
+ {`\string#1' invalid in math mode}
{This command may not be used in math mode}}
\def\csq@err@notdef#1{%
\csq@error
- {Command or environment `\string #1' not defined}
+ {`\string#1' not defined}
{This command or environment environment appears to
- be undefined}}
+ be\MessageBreak undefined}}
+
+\def\csq@err@invldopt#1{%
+ \csq@error
+ {Option `#1' invalid}
+ {The option you have supplied is invalid. See the csquotes
+ manual\MessageBreak for valid option keys and their
+ possible values}}
-\def\csq@err@alloc#1{%
+\def\csq@err@alloc{%
\csq@error
- {Character \string #1 already allocated}
- {This character is already allocated as active quote,
- delimiter,\MessageBreak or closing mark}}
+ {Invalid argument}
+ {One of the arguments you have supplied is already allocated
+ as\MessageBreak active quote or delimiter}}
-\def\csq@err@invquote{%
+\def\csq@err@invldchar{%
\csq@error
{Invalid argument}
- {One of the arguments you have supplied is invalid.
- Only single\MessageBreak characters with category
- code 7-8 and 12-13 may be used as\MessageBreak
- active quotes}}
+ {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 the LaTeX syntax or reserved\MessageBreak
+ for a specific purpose are invalid}}
-\def\csq@err@invdelim{%
+\def\csq@err@invldutf{%
\csq@error
{Invalid argument}
- {One of the arguments you have supplied is invalid.
- Only single\MessageBreak characters with category
- code 3-4, 7-8, 12-13 may be used as\MessageBreak
- delimiters or closing marks}}
+ {Only valid UTF-8 sequences representing a single
+ character\MessageBreak may be allocated as active quotes}}
+
+\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}}
+
+\def\csq@err@nbquote{%
+ \csq@err@mismatch{%
+ You have nested a block quotation. Block quotation
+ commands\MessageBreak may only be used on quotation level 0}}%
% Warnings
\def\csq@warn@nobabel#1{%
\csq@warning
- {The `babel' package is not available}
- {#1}
+ {The `babel' package is not available.\MessageBreak #1}
{#1}
- {Try loading the `babel' package if you want to use this
- feature}}
+ {Load the `babel' package to use this feature}}
\def\csq@warn@noomega#1{%
\csq@warning
+ {Quote style `#1' requires Omega.\MessageBreak
+ Some features will be missing}
{Quote style `#1' requires Omega}
- {Some features will be missing}
- {Quote style `#1' requires Omega}
- {Try compiling the document with `lambda' instead of `latex'}}
+ {Compile the document with `lambda' instead of `latex'}}
\def\csq@warn@location#1{%
\csq@warning
- {Command `\string #1' invalid at this point}
- {Ignoring command}
- {Command `\string #1' invalid at this point}
- {This command may not be used at this particular location}}
-
-% Notices
-
-\def\csq@info@legacy#1#2{%
- \csq@info{%
- Command `\string #1' is depreciated.\MessageBreak
- Please use `\string #2' instead}%
- #2}
+ {`\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 user manual of the `csquotes'
+ package for details}}
+
+\def\csq@warn@legacy#1#2{%
+ \csq@warning
+ {`\string#1' is deprecated.\MessageBreak
+ Using `\string#2' instead}
+ {`\string#1' is deprecated}
+ {Please use `\string#2' instead}%
+ \let#1#2#2}
%% Opening quotation mark
@@ -263,9 +342,11 @@
\def\csq@oqmark{%
\ifnum\csq@qlevel>\z@
\csq@err@mismatch{%
- You have requested a level 1 quote, but
- the current quotation\MessageBreak level
- is already \the\csq@qlevel}%
+ Level 1 quote group invalid at this point:
+ the current level is \the\csq@qlevel}%
+ \csq@bqgroup
+ \advance\csq@qlevel\@ne
+ \let\csq@oqmark\csq@qerror
\else
\csq@bqgroup
\csq@qlevel\@ne
@@ -283,9 +364,11 @@
\def\csq@iqmark{%
\ifnum\csq@qlevel>\@ne
\csq@err@mismatch{%
- You have requested a level 2 quote, but
- the current quotation\MessageBreak level
- is already \the\csq@qlevel}%
+ Level 2 quote group invalid at this point:
+ the current level is \the\csq@qlevel}%
+ \csq@bqgroup
+ \advance\csq@qlevel\@ne
+ \let\csq@iqmark\csq@qerror
\else
\csq@bqgroup
\csq@qlevel\tw@
@@ -304,10 +387,9 @@
\def\csq@qopen@i{%
\ifnum\csq@qlevel>\@ne
\csq@err@mismatch{%
- You have requested a level 1 or 2 quote,
- but the current\MessageBreak quotation
- level is already \the\csq@qlevel}%
- \csq@eqgroup
+ New quote group invalid at this point:
+ the current level is \the\csq@qlevel}%
+ \advance\csq@qlevel\@ne
\else
\advance\csq@qlevel\@ne
\csq@resetstyle
@@ -330,10 +412,9 @@
\def\csq@iqopen@i{%
\ifnum\csq@qlevel>\@ne
\csq@err@mismatch{%
- You have requested a level 2 quote, but
- the current quotation\MessageBreak level
- is already \the\csq@qlevel}%
- \csq@eqgroup
+ Level 2 quote group invalid at this point:
+ the current level is \the\csq@qlevel}%
+ \advance\csq@qlevel\@ne
\else
\csq@qlevel\tw@
\csq@resetstyle
@@ -342,11 +423,6 @@
\csq@theqmark@iopen
\fi}
-% Nestable marks + babel
-
-\def\csq@qopen@lang#1{\csq@bqgroup\csq@lang{#1}\csq@qopen@i}
-\def\csq@qopen@hyph#1{\csq@bqgroup\csq@hyph{#1}\csq@qopen@i}
-
%% Closing quotation mark
\def\csq@qclose{%
@@ -371,10 +447,13 @@
\expandafter\expandafter
\expandafter\csq@restkern
\else
- \csq@err@mismatch{%
- You have requested that the current quotation
- be closed, but\MessageBreak the current
- quotation level is already \the\csq@qlevel}%
+ \ifnum\csq@qlevel>\z@
+ \csq@qerror
+ \else
+ \csq@err@mismatch{%
+ Cannot close the current quote group:
+ the current level is \the\csq@qlevel}%
+ \fi
\fi
\fi}
@@ -390,6 +469,10 @@
\csq@eadd\csq@tempa{\csq@lastsf\the\csq@lastsf\relax}%
\csq@tempa}
+\def\csq@qerror{%
+ \csq@eqgroup
+ \csq@errormark}
+
%% Style initialization
\def\csq@init{%
@@ -430,7 +513,8 @@
\def\noexpand\csq@thekern@close{\the\@tempdima}}%
\fi
\csq@tempa
- \else
+ \fi
+ \ifnum\csq@qlevel=\tw@
\csq@theqmark@iinit
\ifx\csq@theqmark@imiddle\@empty
\else
@@ -457,10 +541,10 @@
\def\csq@restkern@ii{%
\ifcat a\noexpand\csq@kerntok@ii
- \csq@restkern@iii
+ \expandafter\csq@restkern@iii
\fi
\ifcat 1\noexpand\csq@kerntok@ii
- \csq@restkern@iii
+ \expandafter\csq@restkern@iii
\fi}
\def\csq@restkern@iii{%
@@ -527,12 +611,12 @@
\let\nonfrenchspacing\csq@setencodes}
\def\csq@setfrcodes{%
- \sfcode`\,=1001
- \sfcode`\;=1002
- \sfcode`\:=1003
- \sfcode`\.=1004
- \sfcode`\!=1005
- \sfcode`\?=1006
+ \sfcode`\,=1002
+ \sfcode`\;=1003
+ \sfcode`\:=1004
+ \sfcode`\.=1005
+ \sfcode`\!=1006
+ \sfcode`\?=1007
}
\def\csq@setencodes{%
@@ -544,12 +628,13 @@
\sfcode`\?=3002
}
-\@namedef{csq@frcode@1250}{1001}
-\@namedef{csq@frcode@1500}{1002}
-\@namedef{csq@frcode@2000}{1003}
-\@namedef{csq@frcode@3000}{1004}
-\@namedef{csq@frcode@3001}{1005}
-\@namedef{csq@frcode@3002}{1006}
+\csq@csdef{csq@frcode@1001}{1001}% abbrv. dot
+\csq@csdef{csq@frcode@1250}{1002}
+\csq@csdef{csq@frcode@1500}{1003}
+\csq@csdef{csq@frcode@2000}{1004}
+\csq@csdef{csq@frcode@3000}{1005}
+\csq@csdef{csq@frcode@3001}{1006}
+\csq@csdef{csq@frcode@3002}{1007}
\def\csq@setlastsf{%
\ifhmode
@@ -562,56 +647,56 @@
\fi}
\newcommand*{\ifquotepunct}{%
- \ifnum\csq@lastsf>\@m
+ \ifnum\csq@lastsf>1001
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquotecomma}{%
- \ifnum\csq@lastsf=1001
+ \ifnum\csq@lastsf=1002
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquotesemicolon}{%
- \ifnum\csq@lastsf=1002
+ \ifnum\csq@lastsf=1003
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquotecolon}{%
- \ifnum\csq@lastsf=1003
+ \ifnum\csq@lastsf=1004
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquoteterm}{%
- \ifnum\csq@lastsf>1003
+ \ifnum\csq@lastsf>1004
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquoteperiod}{%
- \ifnum\csq@lastsf=1004
+ \ifnum\csq@lastsf=1005
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquoteexclam}{%
- \ifnum\csq@lastsf=1005
+ \ifnum\csq@lastsf=1006
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand*{\ifquotequestion}{%
- \ifnum\csq@lastsf=1006
+ \ifnum\csq@lastsf=1007
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
@@ -620,14 +705,18 @@
%% Babel interface
\def\csq@setstyle#1{%
+ \begingroup
+ \let\if@safe@actives\iftrue
\csq@ifcsundefined{csq@qstyle@#1}
{\csq@warning
+ {Quote style `#1' not defined.\MessageBreak Ignoring command}
{Quote style `#1' not defined}
- {Ignoring command}
- {Quote style `#1' not defined}
- {Define the style or alias first before using it}}
- {\edef\csq@currentstyle{#1}%
- \@nameuse{csq@qstyle@#1}}}
+ {Define the style or alias first}
+ \endgroup}
+ {\edef\csq@tempa{\endgroup
+ \def\noexpand\csq@currentstyle{#1}%
+ \noexpand\@nameuse{csq@qstyle@#1}}%
+ \csq@tempa}}
\def\csq@resetstyle{%
\ifcsq@reset
@@ -635,9 +724,9 @@
\else
\csq@ifcsundefined{csq@qstyle@\languagename}
{\csq@warning
- {No quote style for language `\languagename'}
- {Using fallback style}
- {No quote style for language `\languagename'}
+ {No style for language `\languagename'.\MessageBreak
+ Using fallback style}
+ {No style for language `\languagename'}
{Define a style or alias for this language first}%
\csq@setstyle{fallback}}
{\csq@setstyle{\languagename}}%
@@ -654,7 +743,7 @@
{}
{\@nameuse{otherlanguage*}{\csq@mainlang}}}
-% \lowercase: workaround for page headers of standard classes
+% \lowercase: workaround for page headers of book.cls et al.
\def\csq@lang#1{%
\csq@savelang
@@ -687,13 +776,19 @@
{\csq@ifcsundefined{l@UKenglish}
{}
{\let\l@ukenglish\l@UKenglish}}
- {}}
+ {}%
+ \ifcsq@ronce
+ \DeclareQuoteAlias{\languagename}{default}%
+ \fi}
\csq@add\csq@mknobabel{%
\ifcsq@reset
- \csq@warn@nobabel{Disabling multilingual support}%
+ \csq@warn@nobabel{Cannot enable multilingual support}%
\csq@resetfalse
\fi
+ \ifcsq@ronce
+ \csq@warn@nobabel{Cannot adjust language}%
+ \fi
\def\csq@resetqstyle{%
\csq@warn@nobabel{Cannot enable multilingual support}}%
\let\csq@lang\csq@nolang
@@ -701,7 +796,10 @@
%% Markup with control sequences
-% Argument parser
+% Argument parsers
+
+% {<macro>}[<arg1>][<arg2>] =>
+% <macro>{\mkcitation}{<arg1>}{<arg2>}
\def\csq@getcargs#1{%
\@ifnextchar[%]
@@ -716,7 +814,8 @@
\long\def\csq@getcargs@ii#1#2[#3]{%
#1{\mkcitation}{#2}{#3}}
-% Integrated argument parser
+% {<macro>}[<arg1>][<arg2>]{<arg3>}[<arg4>] =>
+% <macro>{\mkccitation}{\csq@cite[<arg1>][<arg2>]{<arg3>}}{<arg4>}
\def\csq@getccargs#1{%
\@ifnextchar[%]
@@ -771,7 +870,7 @@
% PDF strings
\long\def\csq@pdf@quote#1{%
- \if #1*\relax
+ \if#1*\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
@@ -785,7 +884,7 @@
\csq@pdf@oiqmark #1\csq@pdf@ciqmark}
\long\def\csq@pdf@fquote#1{%
- \if #1*\relax
+ \if#1*\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
@@ -793,7 +892,7 @@
{\expandafter\csq@pdf@quote@ii\@gobble}
{\csq@pdf@quote@i}}
-\csq@add\csq@mkpdfstrings{%
+\csq@add\csq@mkhyperref{%
\let\enquote\csq@pdf@quote
\let\foreignquote\csq@pdf@fquote
\let\hyphenquote\csq@pdf@fquote}
@@ -817,7 +916,7 @@
\csq@ifblank{#3}
{}
{\csq@add\csq@tempa{#2{#3}}}%
- #1\quotetext #5\endquotetext
+ #1\quotetext#5\endquotetext
\csq@tempa\mkfintextpunct{#4}}
% Text quotes + babel
@@ -875,13 +974,13 @@
% PDF strings
-\csq@add\csq@mkpdfstrings{%
- \def\textquote{\csq@warn@pdfstrings\textquote}%
- \def\foreigntextquote{\csq@warn@pdfstrings\foreigntextquote}%
- \def\hyphentextquote{\csq@warn@pdfstrings\hyphentextquote}%
- \def\textcquote{\csq@warn@pdfstrings\textcquote}%
- \def\foreigntextcquote{\csq@warn@pdfstrings\foreigntextcquote}%
- \def\hyphentextcquote{\csq@warn@pdfstrings\hyphentextcquote}}
+\csq@add\csq@mkhyperref{%
+ \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
@@ -890,62 +989,57 @@
{\csq@err@mmode\blockquote}
{\csq@getcargs{\csq@bquote{}}}}
-% {<init>}{<hook>}{<cite>}{<punct>}{<text>}
-
\def\csq@bquote{%
- \begingroup
- \let\if@tempswa\ifcsq@block
- \ifnum\csq@qlevel>\z@
- \@tempswatrue
- \fi
- \expandafter\endgroup\if@tempswa
- \csq@err@mismatch{%
- You have nested a block quotation. Block quotation
- commands\MessageBreak may only be used on quotation
- level 0}%
- \expandafter\@gobblefive
- \else
- \expandafter\csq@bquote@i
- \fi}
+ \csq@ifnested
+ {\csq@err@nbquote\@gobblefive}
+ {\ifinner
+ \expandafter\csq@bquote@iii
+ \else
+ \expandafter\csq@bquote@i
+ \fi}}
-\providecommand{\@gobblefive}[5]{}
+% {<init>}{<hook>}{<cite>}{<punct>}{<text>}
\long\def\csq@bquote@i#1#2#3#4#5{%
\begingroup
- \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
- \edef\csq@tempa{\cl@@ckpt}%
- \let\@elt\relax
- \let\csq@bquote\@gobblefive
- \let\csq@error\@gobbletwo
- \let\csq@warning\@gobblefour
- \let\csq@info\@gobble
- \let\label\@gobble
- \let\index\@gobble
- \let\glossary\@gobble
- \@fileswfalse
- \csq@blockfalse
- \def\par{\csq@blocktrue\@par}%
- \setbox\@tempboxa=\vbox{%
- \parindent\z@
- \vrule \@height1\baselineskip \@width\z@ #1#5%
- \ifcsq@block\aftergroup\csq@blocktrue\fi}%
- \ifdim\ht\@tempboxa>\csq@threshold\baselineskip
- \csq@blocktrue
- \fi
- \csq@tempa
- \expandafter\endgroup\ifcsq@block
- \expandafter\@firstoftwo
+ \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
+ \edef\csq@tempa{\cl@@ckpt}%
+ \let\@elt\relax
+ \let\csq@nbgobble\@gobble
+ \let\csq@bquote\@gobblefive
+ \let\csq@error\@gobbletwo
+ \let\csq@warning\@gobblethree
+ \let\csq@info\@gobble
+ \let\label\@gobble
+ \let\index\@gobble
+ \let\glossary\@gobble
+ \@fileswfalse
+ \csq@blockfalse
+ \def\par{\aftergroup\csq@blocktrue\@par}%
+ \setbox\@tempboxa=\vbox{%
+ \parfillskip\z@ \@plus 1fil\relax
+ \parindent\z@
+ \vrule \@height1\baselineskip \@width\z@ #1#5}%
+ \ifdim\ht\@tempboxa>\csq@tshold\baselineskip
+ \csq@blocktrue
+ \fi
+ \ifcsq@block
+ \aftergroup\@firstoftwo
\else
- \expandafter\@secondoftwo
+ \aftergroup\@secondoftwo
\fi
- {\csq@bquote@ii{#1}{#2}{#3}{#4}{#5}}
- {\csq@bquote@iii{#1}{#2}{#3}{#4}{#5}}}
+ \csq@tempa
+ \endgroup
+ {\csq@bquote@ii{#1}{#2}{#3}{#4}{#5}}
+ {\csq@bquote@iii{#1}{#2}{#3}{#4}{#5}}}
+
+\let\csq@nbgobble\@firstofone
\long\def\csq@bquote@ii#1#2#3#4#5{%
\csq@checkblockcite
\begin{\csq@blockenvironment}%
\csq@blocktrue
- \begingroup #1%
+ \begingroup#1%
\csq@setsfcodes
\quoteblock
#5%
@@ -968,7 +1062,7 @@
\csq@ifblank{#3}
{}
{\csq@add\csq@tempa{#2{#3}}}%
- #1\csq@qopen@i\quotetext #5\endquotetext
+ #1\csq@qopen@i\quotetext#5\endquotetext
\csq@tempa\mkfinblockpunct{#4}}
% Block quotes + babel
@@ -1004,13 +1098,13 @@
% PDF strings
-\csq@add\csq@mkpdfstrings{%
- \def\blockquote{\csq@warn@pdfstrings\blockquote}%
- \def\foreignblockquote{\csq@warn@pdfstrings\foreignblockquote}%
- \def\hyphenblockquote{\csq@warn@pdfstrings\hyphenblockquote}%
- \def\blockcquote{\csq@warn@pdfstrings\blockcquote}%
- \def\foreignblockcquote{\csq@warn@pdfstrings\foreignblockcquote}%
- \def\hyphenblockcquote{\csq@warn@pdfstrings\hyphenblockcquote}}
+\csq@add\csq@mkhyperref{%
+ \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
@@ -1031,9 +1125,9 @@
\def\csq@bdquote#1{%
\@nameuse{\csq@blockenvironment}%
\csq@blocktrue
- \begingroup #1%
+ \begingroup#1%
\csq@setsfcodes
- \quoteblock\ignorespaces}
+ \quoteblock}
\def\csq@edquote{%
\ifdim\lastskip>\z@\unskip\fi
@@ -1083,8 +1177,8 @@
% Hooks
-\newcommand*{\mkcitation}[1]{\space (#1)}
-\newcommand*{\mkccitation}[1]{\space #1}
+\newcommand*{\mkcitation}[1]{\space(#1)}
+\newcommand*{\mkccitation}[1]{\space#1}
\newcommand*{\mkmidtextpunct}[1]{}
\newcommand*{\mkfintextpunct}[1]{#1}
@@ -1100,7 +1194,7 @@
\def\csq@err@blockcite{%
\csq@error
- {Command `\string\blockcite' is depreciated}
+ {`\string\blockcite' is deprecated}
{Please use `\string\mkcitation' instead}}
\let\blockcite\csq@err@blockcite
@@ -1108,258 +1202,500 @@
\ifx\blockcite\csq@err@blockcite
\else
\csq@warning
- {`\string\blockcite' is superseded by `\string\mkcitation'}
- {As a temporary solution, I will copy the current
- definition\MessageBreak of `\string\blockcite' to
- `\string\mkcitation'}
- {Command `\string\blockcite' is depreciated}
+ {`\string\blockcite' superseded by
+ `\string\mkcitation'.\MessageBreak As a workaround, I will
+ copy the current definition\MessageBreak of
+ `\string\blockcite' to `\string\mkcitation'}
+ {`\string\blockcite' is deprecated}
{Please use `\string\mkcitation' instead}%
\let\mkcitation\blockcite
\let\blockcite\csq@err@blockcite
\fi}
\newcommand*{\cquote}{%
- \csq@info@legacy\cquote\textcquote}
+ \csq@warn@legacy\cquote\textcquote}
\newcommand*{\foreigncquote}{%
- \csq@info@legacy\foreigncquote\foreigntextcquote}
+ \csq@warn@legacy\foreigncquote\foreigntextcquote}
\newcommand*{\hyphencquote}{%
- \csq@info@legacy\hyphencquote\hyphentextcquote}
+ \csq@warn@legacy\hyphencquote\hyphentextcquote}
%% Markup with active characters
-% Manage active characters
-
\let\csq@dospecials\@empty
-\let\csq@dodelimiters\@empty
+\let\csq@doutfspecials\@empty
\def\csq@do@dospecial#1#2{%
\ifnum\catcode`#1=\active
- \csq@info{Defining active character \string #1}%
+ \csq@info{Redefining character \string#1}%
+ \csq@letspecial{#1}{csq@special@\number`#1}%
\else
- \csq@info{Making \string #1 an active character}%
- \fi
- \csq@edefspecial{#1}{\noexpand\csq@special{\number`#1}}}
+ \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 active character \string #1}%
- \catcode`#1=\active
- \expandafter\let
- \expandafter #1\csname csq@saved@\number`#1\endcsname
+ \csq@info{Resetting character \string#1}%
+ \csq@letspecial{#1}{csq@saved@\number`#1}%
\else
- \csq@info{Resetting catcode of character \string #1}%
- \catcode`#1=#2
+ \csq@info{Resetting catcode of \string#1}%
+ \catcode`#1=#2\relax
\fi}
\def\csq@do@verbspecial#1#2{%
- \ifnum`#1<128
- \csq@edefspecial{#1}{\string #1}%
+ \csq@info{Redefining character \string#1}%
+ \ifnum`#1<128\relax
+ \csq@edefspecial{#1}{\string#1}%
\else
- \csq@edefspecial{#1}{%
- \noexpand\@nameuse{csq@saved@\number`#1}}%
+ \csq@letspecial{#1}{csq@saved@\number`#1}%
\fi}
-\def\csq@do@fixdelim#1#2{%
- \ifnum\catcode`#1=#2
- \else
- \csq@info{Restoring catcode of character \string #1}%
- \catcode`#1=#2
+\def\csq@do@doutfspecial#1{%
+ \csq@info{Redefining character \csq@utfprint{#1}}%
+ \csq@csletcs{u8:\csq@string{#1}}{csq@special@\csq@number{#1}}}
+
+\def\csq@do@undoutfspecial#1{%
+ \csq@info{Resetting character \csq@utfprint{#1}}%
+ \csq@csletcs{u8:\csq@string{#1}}{csq@saved@\csq@number{#1}}}
+
+\def\csq@do@delspecial#1#2{%
+ \csq@info{Deallocating character \string#1}%
+ \csq@cslet{csq@special@\number`#1}\@undefined
+ \csq@cslet{csq@saved@\number`#1}\@undefined
+ \csq@cslet{csq@string@\number`#1}\@undefined
+ \csq@cslet{csq@textdef@\number`#1}\@undefined
+ \csq@cslet{csq@xtxtdef@\number`#1}\@undefined
+ \csq@cslet{csq@pdfdef@\number`#1}\@undefined}
+
+\def\csq@do@delutfspecial#1{%
+ \csq@info{Deallocating character \csq@utfprint{#1}}%
+ \csq@cslet{csq@special@\csq@number{#1}}\@undefined
+ \csq@cslet{csq@saved@\csq@number{#1}}\@undefined
+ \csq@cslet{csq@string@\csq@number{#1}}\@undefined
+ \csq@cslet{csq@textdef@\csq@number{#1}}\@undefined
+ \csq@cslet{csq@xtxtdef@\csq@number{#1}}\@undefined
+ \csq@cslet{csq@pdfdef@\csq@number{#1}}\@undefined}
+
+\def\csq@mkenable{%
+ \let\do\csq@do@dospecial
+ \csq@dospecials
+ \let\do\csq@do@doutfspecial
+ \csq@doutfspecials
+ \let\do\noexpand
+ \csq@activetrue}
+
+\def\csq@mkdisable{%
+ \ifcsq@active
+ \let\do\csq@do@undospecial
+ \csq@dospecials
+ \let\do\csq@do@undoutfspecial
+ \csq@doutfspecials
+ \let\do\noexpand
+ \csq@activefalse
+ \fi}
+
+\def\csq@mkverbatim{%
+ \ifcsq@active
+ \let\do\csq@do@verbspecial
+ \csq@dospecials
+ \let\do\csq@do@undoutfspecial
+ \csq@doutfspecials
+ \let\do\noexpand
\fi}
-% Register active characters
+\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
+\csq@add\csq@mkhyperref{\csq@mkpdfstrings}
+
+% Regular specials
-\def\csq@addspecial#1#2#3{%
- \csq@checkquote{#1}{\csq@addspecial@i{#1}{#2}{#3}}}
+% {<char>}{<textdef>}{<pdfdef1>}{<pdfdef2>}
-% {<char>}{<activedef>}{<pdfstrdef>}
+\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#1#2#3{%
- \@namedef{csq@string@\number`#1}{\string #1}%
- \@namedef{csq@active@\number`#1}{#2}%
- \@namedef{csq@pdfstr@\number`#1}{#3}%
+% {<char>}{<macro>}{<textdef>}{<pdfdef1>}{<pdfdef2>}
+
+\def\csq@addspecial@i@s#1#2#3#4#5{%
+ \csq@info{Allocating character \string#1}%
+ \csq@csedef{csq@special@\number`#1}{\noexpand#2{\number`#1}}%
\ifnum\catcode`#1=\active
- \expandafter\let\csname csq@saved@\number`#1\endcsname #1%
+ \csq@cslet{csq@saved@\number`#1}{#1}%
\else
- \@namedef{csq@saved@\number`#1}{#1}%
- \fi
- \csq@eadd\csq@dospecials{%
- \noexpand\do{\noexpand #1}{\the\catcode`#1}}%
- \ifnum`#1<128
- \csq@addto@dolist{#1}{\dospecials}{\do}%
+ \csq@csdef{csq@saved@\number`#1}{#1}%
\fi
- \csq@addto@dolist{#1}{\@sanitize}{\@makeother}}
+ \csq@csedef{csq@string@\number`#1}{\string#1}%
+ \csq@csdef{csq@textdef@\number`#1}{#3}%
+ \csq@ifblank{#5}
+ {\csq@csdef{csq@pdfdef@\number`#1}{#4}}
+ {\csq@add\csq@mkpdfstrings{\csq@defpspecial{#1}{#4}{#5}}}%
+ \csq@eadd\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}
-% {<char>}{<omark>}{<cmark>}
+% {<char>}{<macro>}{<textdef>}{<pdfdef1>}{<pdfdef2>}
-\def\csq@addpdfspecial#1#2#3{%
- \csq@add\csq@mkpdfstrings{\csq@defpdfspecial{#1}{#2}{#3}}}
+\def\csq@addspecial@i@u#1#2#3#4#5{%
+ \csq@info{Allocating character \csq@utfprint{#1}}%
+ \csq@csedef{csq@special@\csq@number{#1}}{%
+ \noexpand#2{\csq@number{#1}}}%
+ \csq@ifcsundefined{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}%
+ \csq@csdef{csq@saved@\csq@number{#1}}{}}
+ {\csq@csletcs{csq@saved@\csq@number{#1}}{u8:\csq@string{#1}}}%
+ \csq@csedef{csq@string@\csq@number{#1}}{\csq@string{#1}}%
+ \csq@csdef{csq@textdef@\csq@number{#1}}{#3}%
+ \csq@ifblank{#5}
+ {\csq@csdef{csq@pdfdef@\csq@number{#1}}{#4}}
+ {\csq@add\csq@mkpdfstrings{\csq@defupspecial{#1}{#4}{#5}}}%
+ \csq@eadd\csq@doutfspecials{\noexpand\do{\csq@string{#1}}}}
+
+% Block specials
+
+% {<char1>}{<delim>}{<char2>}{<textdef>}
\def\csq@addbspecial#1#2#3#4{%
- \csq@checkquote{#1}{%
- \@namedef{csq@saved@\number`#1}{}%
- \csq@checkdelim{#2}{%
- \@namedef{csq@delim@\number`#2}{}%
- \csq@checkdelim{#3}{%
- \@namedef{csq@delim@\number`#3}{}%
- \ifnum`#2=`#3
- \csq@err@alloc{#2}%
- \else
- \csq@addbspecial@i{#1}{#2}{#3}{#4}%
- \fi}}}}
-
-% {<char1>}{<delim>}{<char2>}{<activedef>}
-
-\def\csq@addbspecial@i#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
- \edef\csq@tempa{\endgroup
- \noexpand\csq@addspecial@i
- {\noexpand #1}
- {\csname csq@block@\number`#1\endcsname}%
- {\noexpand\csq@warn@pdfstrings{\string #1}}%
- \noexpand\csq@defbspecial
- {\csname csq@block@\number`#1\endcsname}}%
- \csq@add\csq@tempa{{#2}{#3}{#4}}%
+ \def\csq@tempa{\endgroup\csq@addspecial@i@s{#1}{\csqBQ}{}}%
+ \csq@eadd\csq@tempa{%
+ {\expandafter\noexpand\csname csq@saved@\number`#1\endcsname
+ \noexpand\pdfstringdefWarn{\string#1}}{}}%
\csq@tempa
- \csq@eadd\csq@dodelimiters{%
- \noexpand\do{\noexpand #2}{\the\catcode`#2}%
- \noexpand\do{\noexpand #3}{\the\catcode`#3}}}
+ \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}{}}%
+ \csq@eadd\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{\csq@add\csq@tempb{{~}}}%
+ \csq@add\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{\csq@add\csq@tempa{~}}%
+ \csq@add\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
+ {\@nameuse{csq@string@#1}}
+ {\csq@iftypeset
+ {\csq@ifmmode
+ {\@nameuse{csq@saved@#1}}
+ {\@nameuse{csq@textdef@#1}}}
+ {\csq@ifstrings
+ {\@nameuse{csq@string@#1}}
+ {\noexpand\csqQQ{#1}}}}}
+
+\newcommand*{\csqBQ}[1]{%
+ \csq@ifsafeactives
+ {\@nameuse{csq@string@#1}}
+ {\csq@iftypeset
+ {\csq@ifmmode
+ {\@nameuse{csq@saved@#1}}
+ {\csq@ifnested
+ {\csq@err@nbquote}
+ {\csq@nbgobble{\@nameuse{csq@textdef@#1}}}}}
+ {\csq@ifstrings
+ {\@nameuse{csq@string@#1}}
+ {\noexpand\csqBQbeg{#1}}}}}
+
+\newcommand*{\csqBQbeg}[1]{%
+ \csq@ifsafeactives
+ {\@nameuse{csq@string@#1}}
+ {\csq@iftypeset
+ {\csq@ifmmode
+ {\@nameuse{csq@saved@#1}}
+ {\csq@ifnested
+ {\csq@err@nbquote}
+ {\csq@nbgobble{\@nameuse{csq@xtxtdef@#1}}}}}
+ {\csq@ifstrings
+ {\@nameuse{csq@string@#1}}
+ {\noexpand\csqBQbeg{#1}}}}}
+
+\newcommand*{\csqBQsep}[1]{%
+ \csq@ifsafeactives
+ {\@nameuse{csq@string@#1}}
+ {\csq@iftypeset
+ {\@nameuse{csq@saved@#1}}
+ {\csq@ifstrings
+ {\@nameuse{csq@string@#1}}
+ {\noexpand\csqBQsep{#1}}}}}
+
+\newcommand*{\csqBQend}[1]{%
+ \csq@ifsafeactives
+ {\@nameuse{csq@string@#1}}
+ {\csq@iftypeset
+ {\@nameuse{csq@saved@#1}}
+ {\csq@ifstrings
+ {\@nameuse{csq@string@#1}}
+ {\noexpand\csqBQend{#1}}}}}
+
+\csq@add\csq@mkhyperref{%
+ \def\csqQQ##1{\@nameuse{csq@pdfdef@##1}}%
+ \def\csqBQ##1{\@nameuse{csq@pdfdef@##1}}%
+ \def\csqBQbeg##1{\@nameuse{csq@pdfdef@##1}}%
+ \def\csqBQsep##1{\@nameuse{csq@saved@##1}}%
+ \def\csqBQend##1{\@nameuse{csq@saved@##1}}}
+
+% Legacy commands
+
+\def\csq@special{\csqQQ}
-% Define and use active characters
+% Define specials
+
+% {<char>}{<def>}
\def\csq@edefspecial#1#2{%
\begingroup
- \catcode`\~=\active
- \uccode`\~=`#1\relax
- \uppercase{\endgroup\edef~}{#2}%
- \catcode`#1=\active}
+ \uccode`\~=`#1\relax
+ \uppercase{\endgroup\edef~}{#2}}
+
+% {<char>}{<csname>}
-\def\csq@defpdfspecial#1#2#3{%
+\def\csq@letspecial#1#2{%
\begingroup
- \catcode`\~=\active
- \uccode`\~=`#1\relax
- \uppercase{\endgroup\def~##1~}{#2##1#3}}
+ \uccode`\~=`#1\relax
+ \uppercase{\def\csq@tempa{\endgroup\let~}}%
+ \expandafter\csq@tempa\csname#2\endcsname}
-% {<csname>}{<delim>}{<char2>}{<macro>}
+% {<macro>}{<delim>}{<char2>}{<def>}
\def\csq@defbspecial#1#2#3#4{%
- \long\def#1##1#3{\csq@bspecial{##1}{#2}{#4}}}
+ \long\def#1##1#3{\csq@bspecial@i{##1}{#2}{#4}}}
-\def\csq@special{%
- \ifx\if@safe@actives\iftrue
- \expandafter\csq@special@string
- \else
- \ifx\protect\@typeset@protect
- \ifmmode
- \expandafter\expandafter\expandafter
- \expandafter\expandafter\expandafter
- \expandafter\csq@special@saved
- \else
- \expandafter\expandafter\expandafter
- \expandafter\expandafter\expandafter
- \expandafter\csq@special@active
- \fi
- \else
- \ifx\protect\string
- \string\csq@special
- \else
- \noexpand\csq@special
- \fi
- \fi
- \fi}
+% {<text>}{<delim>}{<macro>}
-\def\csq@special@saved#1{\@nameuse{csq@saved@#1}}
-\def\csq@special@string#1{\@nameuse{csq@string@#1}}
-\def\csq@special@active#1{\@nameuse{csq@active@#1}}
-\def\csq@special@pdfstr#1{\@nameuse{csq@pdfstr@#1}}
+\long\def\csq@bspecial@i#1#2#3{%
+ \long\def\csq@bspecial@ii##1#2##2&{%
+ \csq@ifblank{##2}
+ {#3{}{}{#1}}
+ {\csq@bspecial@iii#1&}}%
+ \long\def\csq@bspecial@iii##1#2##2&{%
+ #3{##2}{}{##1}}%
+ \csq@bspecial@ii#1#2&}
-\csq@add\csq@mkpdfstrings{\let\csq@special\csq@special@pdfstr}
+% {<macro>}{<def>}
-% {<text>}{<delim>}{<macro>}
+\def\csq@defxbspecial#1#2{%
+ \long\def#1##1\csqBQend##2{\csq@xbspecial@i{##1}{#2}}}
-\begingroup
- \catcode`\&=3
+% {<text>}{<macro>}
- \long\gdef\csq@bspecial#1#2#3{%
- \long\def\csq@bspecial@i##1#2##2&{%
- \csq@ifblank{##2}
- {#3{}{}{#1}}
- {\csq@bspecial@ii#1&}}%
- \long\def\csq@bspecial@ii##1#2##2&{%
- #3{##2}{}{##1}}%
- \csq@bspecial@i#1#2&}
+\long\def\csq@xbspecial@i#1#2{%
+ \long\def\csq@xbspecial@ii##1\csqBQsep##2&{%
+ \csq@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&}
-\endgroup
+% {<char>}{<pdfomark>}{<pdfcmark>}
+
+\def\csq@defpspecial#1#2#3{%
+ \begingroup
+ \uccode`\~=`#1\relax
+ \uppercase{\endgroup\def~##1~}{#2##1#3}}
+
+% {<char>}{<pdfomark>}{<pdfcmark>}
+
+\def\csq@defupspecial#1#2#3{%
+ \expandafter\def\csname u8:\csq@string{#1}\endcsname##1#1{#2##1#3}}
% Validate user input
-\def\csq@checkquote#1{%
- \csq@ifsingle{#1}
- {\csq@ifccode@quote{#1}
- {\csq@ifcsundefined{csq@saved@\number`#1}
- {\csq@ifcsundefined{csq@delim@\number`#1}
- {\@firstofone}
- {\csq@err@alloc{#1}\@gobble}}
- {\csq@err@alloc{#1}\@gobble}}
- {\csq@err@invquote\@gobble}}
- {\csq@err@invquote\@gobble}}
-
-\def\csq@checkdelim#1{%
- \csq@ifsingle{#1}
- {\csq@ifccode@delim{#1}
- {\csq@ifcsundefined{csq@saved@\number`#1}
- {\@firstofone}
- {\csq@err@alloc{#1}\@gobble}}
- {\csq@err@invdelim\@gobble}}
- {\csq@err@invdelim\@gobble}}
-
-\def\csq@ifccode@quote#1{%
+% {<char>}{<macro>}{<utfmacro>}
+
+\def\csq@validate#1#2#3{%
+ \csq@ifutfchar{#1}
+ {\csq@ifvalidutf{#1}
+ {\csq@ifcsundefined{csq@special@\csq@number{#1}}
+ {#3}
+ {\csq@err@alloc}}
+ {\csq@err@invldutf}}
+ {\csq@ifvalidchar{#1}
+ {\csq@ifcsundefined{csq@special@\number`#1}
+ {#2}
+ {\csq@err@alloc}}
+ {\csq@err@invldchar}}}
+
+% {<char>}{<true>}{<false>}
+
+\def\csq@ifutfchar#1{%
+ \csq@ifcsundefined{@inpenc@undefined}
+ {\@secondoftwo}
+ {\begingroup
+ \def\@inpenc@undefined@##1{\def\csq@tempa{##1}}%
+ \@inpenc@undefined
+ \ifx\csq@tempa\csq@utfenc
+ \aftergroup\@firstoftwo
+ \else
+ \aftergroup\@secondoftwo
+ \ifx\csq@tempa\csq@ucsenc
+ \csq@err@ucs
+ \fi
+ \fi
+ \endgroup}%
+ {\csq@ifsingle{#1}
+ {\ifnum`#1<128\relax
+ \expandafter\@secondoftwo
+ \else
+ \csq@err@invldutf
+ \expandafter\@gobbletwo
+ \fi}
+ {\@firstoftwo}}
+ {\csq@ifsingle{#1}
+ {\@secondoftwo}
+ {\csq@err@invldchar
+ \@gobbletwo}}}
+
+\def\csq@utfenc{utf8}
+\def\csq@ucsenc{utf8x}
+
+% {<char>}{<true>}{<false>}
+
+\long\def\csq@ifsingle#1{%
+ \csq@ifblank{#1}
+ {\@secondoftwo}
+ {\expandafter\csq@ifsingle@i
+ \string#1&&\@secondoftwo\@firstoftwo:}}
+\long\def\csq@ifsingle@i#1#2#3&#4#5#6:{#5}
+
+% {<char>}{<true>}{<false>}
+
+\def\csq@ifvalidchar#1{%
\begingroup
- \@tempswafalse
- \ifcase\catcode`#1 % 0 escape
- \or % 1 begin group
- \or % 2 end group
- \or % 3 math shift
- \or % 4 alignment
- \or % 5 eol
- \or % 6 parameter
- \or\@tempswatrue % 7 superscript
- \or\@tempswatrue % 8 subscript
- \or % 9 ignored
- \or % 10 space
- \or % 11 letter
- \or\@tempswatrue % 12 other
- \or\@tempswatrue % 13 active
- \or % 14 comment
- \else % 15 invalid
+ \@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}
+
+% {<char>}{<true>}{<false>}
+
+\def\csq@ifvalidutf#1{%
+ \csq@ifblank{#1}{\@secondoftwo}{\csq@ifvalidutf@i#1&}}
+
+\def\csq@ifvalidutf@i#1#2&{%
+ \csq@ifblank{#2}
+ {\@secondoftwo}% 0x00-0x7F handled elsewhere
+ {\csq@ifutfstart{#1}{\csq@ifvalidutf@ii#2&}{\@secondoftwo}}}
+
+\def\csq@ifvalidutf@ii#1#2&{%
+ \csq@ifutfnext{#1}
+ {\csq@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
- \expandafter\endgroup\if@tempswa
- \expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
-\def\csq@ifccode@delim#1{%
- \begingroup
- \@tempswafalse
- \ifcase\catcode`#1 % 0 escape
- \or % 1 begin group
- \or % 2 end group
- \or\@tempswatrue % 3 math shift
- \or\@tempswatrue % 4 alignment
- \or % 5 eol
- \or % 6 parameter
- \or\@tempswatrue % 7 superscript
- \or\@tempswatrue % 8 subscript
- \or % 9 ignored
- \or % 10 space
- \or % 11 letter
- \or\@tempswatrue % 12 other
- \or\@tempswatrue % 13 active
- \or % 14 comment
- \else % 15 invalid
+\def\csq@ifutfnext#1{%
+ \ifnum`#1>127\relax
+ \ifnum`#1<192\relax
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
\fi
- \expandafter\endgroup\if@tempswa
- \expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
@@ -1367,95 +1703,77 @@
% User interface
\newcommand*{\MakeOuterQuote}[1]{%
- \csq@addspecial{#1}{\csq@oqmark}{}%
- \csq@addpdfspecial{#1}{\csq@pdf@ooqmark}{\csq@pdf@coqmark}}
-\@onlypreamble\MakeOuterQuote
+ \csq@addspecial{#1}{\csq@oqmark}
+ {\csq@pdf@ooqmark}{\csq@pdf@coqmark}}
\newcommand*{\MakeInnerQuote}[1]{%
- \csq@addspecial{#1}{\csq@iqmark}{}%
- \csq@addpdfspecial{#1}{\csq@pdf@oiqmark}{\csq@pdf@ciqmark}}
-\@onlypreamble\MakeInnerQuote
+ \csq@addspecial{#1}{\csq@iqmark}
+ {\csq@pdf@oiqmark}{\csq@pdf@ciqmark}}
\newcommand*{\MakeAutoQuote}[2]{%
- \csq@addspecial{#1}{\csq@qopen}{\csq@pdf@ooqmark}%
- \csq@addspecial{#2}{\csq@qclose}{\csq@pdf@coqmark}}
-\@onlypreamble\MakeAutoQuote
+ \csq@addspecial{#1}{\csq@qopen}{\csq@pdf@ooqmark}{}%
+ \csq@addspecial{#2}{\csq@qclose}{\csq@pdf@coqmark}{}}
\newcommand*{\MakeForeignQuote}[3]{%
- \csq@addspecial{#2}{\csq@qopen@lang{#1}}{\csq@pdf@ooqmark}%
- \csq@addspecial{#3}{\csq@qclose}{\csq@pdf@coqmark}}
-\@onlypreamble\MakeForeignQuote
+ \csq@addspecial{#2}{\csq@bqgroup\csq@lang{#1}\csq@qopen@i}%
+ {\csq@pdf@ooqmark}{}%
+ \csq@addspecial{#3}{\csq@qclose}{\csq@pdf@coqmark}{}}
\newcommand*{\MakeHyphenQuote}[3]{%
- \csq@addspecial{#2}{\csq@qopen@hyph{#1}}{\csq@pdf@ooqmark}%
- \csq@addspecial{#3}{\csq@qclose}{\csq@pdf@coqmark}}
-\@onlypreamble\MakeHyphenQuote
+ \csq@addspecial{#2}{\csq@bqgroup\csq@hyph{#1}\csq@qopen@i}%
+ {\csq@pdf@ooqmark}{}%
+ \csq@addspecial{#3}{\csq@qclose}{\csq@pdf@coqmark}{}}
\newcommand*{\MakeBlockQuote}[3]{%
- \csq@addbspecial{#1}{#2}{#3}{%
- \csq@bquote{}{\mkcitation}}}
-\@onlypreamble\MakeBlockQuote
+ \csq@addbspecial{#1}{#2}{#3}{\csq@bquote{}{\mkcitation}}}
\newcommand*{\MakeForeignBlockQuote}[4]{%
- \csq@addbspecial{#2}{#3}{#4}{%
- \csq@bquote{\csq@lang{#1}}{\mkcitation}}}
-\@onlypreamble\MakeForeignBlockQuote
+ \csq@addbspecial{#2}{#3}{#4}%
+ {\csq@bquote{\csq@lang{#1}}{\mkcitation}}}
\newcommand*{\MakeHyphenBlockQuote}[4]{%
- \csq@addbspecial{#2}{#3}{#4}{%
- \csq@bquote{\csq@hyph{#1}}{\mkcitation}}}
-\@onlypreamble\MakeHyphenBlockQuote
+ \csq@addbspecial{#2}{#3}{#4}%
+ {\csq@bquote{\csq@hyph{#1}}{\mkcitation}}}
-\newcommand*{\RestoreQuotes}{%
- \csq@warn@location\RestoreQuotes}
-\newcommand*{\DisableQuotes}{%
- \csq@warn@location\DisableQuotes}
+\newcommand*{\EnableQuotes}{}
+\newcommand*{\DisableQuotes}{}
+\newcommand*{\VerbatimQuotes}{}
+\newcommand*{\DeleteQuotes}{\csq@mkdelete}
\AtBeginDocument{%
- \def\RestoreQuotes{%
- \let\do\csq@do@dospecial
- \csq@dospecials
- \let\do\csq@do@fixdelim
- \csq@dodelimiters
- \csq@activetrue
- \let\do\noexpand}%
- \def\DisableQuotes{%
- \let\do\csq@do@undospecial
- \csq@dospecials
- \csq@activefalse
- \let\do\noexpand}}
+ \def\EnableQuotes{\csq@mkenable}%
+ \def\DisableQuotes{\csq@mkdisable}%
+ \def\VerbatimQuotes{\csq@mkverbatim}}
% Author interface
-\newcommand*{\@restorequotes}{}
+\newcommand*{\@enablequotes}{}
\newcommand*{\@disablequotes}{}
\newcommand*{\@verbatimquotes}{}
+\newcommand*{\@deletequotes}{%
+ \csq@quiettrue
+ \csq@mkdelete
+ \csq@quietfalse}
\AtBeginDocument{%
- \def\@restorequotes{%
+ \def\@enablequotes{%
\csq@quiettrue
- \let\do\csq@do@dospecial
- \csq@dospecials
- \let\do\csq@do@fixdelim
- \csq@dodelimiters
- \csq@quietfalse
- \csq@activetrue
- \let\do\noexpand}%
+ \csq@mkenable
+ \csq@quietfalse}%
\def\@disablequotes{%
\csq@quiettrue
- \let\do\csq@do@undospecial
- \csq@dospecials
- \csq@quietfalse
- \csq@activefalse
- \let\do\noexpand}%
+ \csq@mkdisable
+ \csq@quietfalse}%
\def\@verbatimquotes{%
- \ifcsq@active
- \csq@quiettrue
- \let\do\csq@do@verbspecial
- \csq@dospecials
- \csq@quietfalse
- \let\do\noexpand
- \fi}}
+ \csq@quiettrue
+ \csq@mkverbatim
+ \csq@quietfalse}}
+
+% Legacy
+
+\newcommand*{\RestoreQuotes}{%
+ \csq@warn@legacy\RestoreQuotes\EnableQuotes}
+\newcommand*{\@restorequotes}{\@enablequotes}
%% Switch quote styles manually
@@ -1473,7 +1791,7 @@
\fi
\csq@ifblank{#1}
{\csq@setstyle{#2}}
- {\csq@setstyle{#2/#1}}}
+ {\csq@setstyle{#2@#1}}}
\def\csq@resetqstyle{%
\csq@info{Enabling multilingual support}%
@@ -1483,9 +1801,10 @@
\newcommand*{\DeclareQuoteStyle}[2][]{%
\begingroup
+ \let\if@safe@actives\iftrue
\csq@ifblank{#1}
- {\def\csq@tempa{#2}}
- {\def\csq@tempa{#2/#1}}%
+ {\edef\csq@tempa{#2}}
+ {\edef\csq@tempa{#2@#1}}%
\csq@ifcsundefined{csq@qstyle@\csq@tempa}
{}
{\csq@info{Redefining quotation style `\csq@tempa'}}%
@@ -1540,13 +1859,14 @@
\newcommand*{\DeclareQuoteAlias}[3][]{%
\begingroup
+ \let\if@safe@actives\iftrue
\csq@ifblank{#1}
- {\def\csq@tempa{#2}}
- {\def\csq@tempa{#2/#1}}%
+ {\edef\csq@tempa{#2}}
+ {\edef\csq@tempa{#2@#1}}%
\csq@ifcsundefined{csq@qstyle@\csq@tempa}
{\csq@error
- {Quote style `\csq@tempa' not defined}
- {Define the style or alias first before using it}}
+ {Quote style not defined}
+ {Define the style or alias `\csq@tempa' first}}
{\csq@ifcsundefined{csq@qstyle@#3}
{}
{\csq@info{Redefining alias `#3' -> `\csq@tempa'}}%
@@ -1559,17 +1879,17 @@
%% Define quotes for PDF strings
\newcommand*{\DeclarePlainStyle}[4]{%
- \gdef\csq@pdf@ooqmark{#1}%
- \gdef\csq@pdf@coqmark{#2}%
- \gdef\csq@pdf@oiqmark{#3}%
- \gdef\csq@pdf@ciqmark{#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
\newcommand*{\DeclareQuoteOption}[1]{%
- \define@key{csq}{#1}{\DeclareQuoteAlias{#1/##1}{#1}}}
+ \define@key{csq}{#1}{\DeclareQuoteAlias[##1]{#1}{#1}}}
\AtEndOfPackage{%
\def\DeclareQuoteOption#1{%
@@ -1578,7 +1898,7 @@
%% Set defaults
\newcommand*{\SetBlockThreshold}[1]{%
- \csq@threshold=#1\relax}
+ \csq@tshold=#1\relax}
\newcommand*{\SetBlockEnvironment}[1]{%
\csq@ifcsundefined{#1}
@@ -1593,12 +1913,21 @@
% Legacy commands
\newcommand*{\setblockthreshold}{%
- \csq@info@legacy\setblockthreshold\SetBlockThreshold}
-
+ \csq@warn@legacy\setblockthreshold\SetBlockThreshold}
\newcommand*{\setblockenvironment}{%
- \csq@info@legacy\setblockenvironment\SetBlockEnvironment}
+ \csq@warn@legacy\setblockenvironment\SetBlockEnvironment}
+
+%% Author interface to internal marks
-%% Frontend to internal marks
+\newcommand*{\initoquote}{%
+ \csq@resetstyle
+ \csq@qlevel\@ne
+ \csq@theqmark@oinit}
+
+\newcommand*{\initiquote}{%
+ \csq@resetstyle
+ \csq@qlevel\tw@
+ \csq@theqmark@iinit}
\newcommand*{\textooquote}{%
\csq@resetstyle
@@ -1626,14 +1955,14 @@
%% Space factor codes
-\@namedef{csq@sfcodes@OT1}{%
+\csq@csdef{csq@sfcodes@OT1}{%
\sfcode 96=\z@ % textquoteleft
\sfcode 39=\z@ % textquoteright
\sfcode 92=\z@ % textquotedblleft
\sfcode 34=\z@ % textquotedblright
}
-\@namedef{csq@sfcodes@T1}{%
+\csq@csdef{csq@sfcodes@T1}{%
\sfcode 96=\z@ % textquoteleft
\sfcode 39=\z@ % textquoteright
\sfcode 16=\z@ % textquotedblleft
@@ -1649,7 +1978,7 @@
\sfcode 34=\z@ % textquotedbl
}
-\@namedef{csq@sfcodes@LY1}{%
+\csq@csdef{csq@sfcodes@LY1}{%
\sfcode 96=\z@ % textquoteleft
\sfcode 39=\z@ % textquoteright
\sfcode147=\z@ % textquotedblleft
@@ -1671,7 +2000,7 @@
\newcommand*{\seteverylineleft}[1]{%
\csq@ifcsundefined{localleftbox}
{\csq@warn@noomega\csq@currentstyle}
- {\leavevmode\localleftbox{#1}}}
+ {\leavevmode\null\localleftbox{#1}}}
\newcommand*{\seteverylineright}[1]{%
\csq@ifcsundefined{localrightbox}
@@ -1681,14 +2010,16 @@
% Improved spacing for French
\newcommand*{\frenchnbspace}{%
- \penalty\@M\hskip 0.8\fontdimen2\font
- plus 0.3\fontdimen3\font minus 0.8\fontdimen4\font}
+ \penalty\@M
+ \hskip 0.8\fontdimen2\font
+ plus 0.3\fontdimen3\font
+ minus 0.8\fontdimen4\font}
\newcommand*{\mkfrenchopenquote}[1]{%
- \leavevmode #1\frenchnbspace}
+ \leavevmode#1\frenchnbspace}
\newcommand*{\mkfrenchclosequote}[1]{%
- \frenchnbspace #1}
+ \frenchnbspace#1}
\newcommand*{\initfrenchquotes}{%
\let\csq@themark\csq@frenchmark}
@@ -1701,11 +2032,11 @@
\relax
\else
\ifnum\spacefactor=1005
- \relax
+ \relax
\else
- \ifnum\spacefactor=1006
- \relax
- \fi
+ \ifnum\spacefactor=1006
+ \relax
+ \fi
\fi
\fi
\fi}
@@ -1754,11 +2085,16 @@
[0.05em]
{\textquoteright}
{\textquoteright}
-\DeclareQuoteStyle[quotes]{french}% verified
+\DeclareQuoteStyle[quotes]{french}
{\mkfrenchopenquote{\guillemotleft}}
{\mkfrenchclosequote{\guillemotright}}
{\mkfrenchopenquote{\textquotedblleft}}
{\mkfrenchclosequote{\textquotedblright}}
+\DeclareQuoteStyle[quotes*]{french}
+ {\mkfrenchopenquote{\guillemotleft}}
+ {\mkfrenchclosequote{\guillemotright}}
+ {\textquotedblleft}
+ {\textquotedblright}
\DeclareQuoteStyle[guillemets]{french}
[\initfrenchquotes]
{\mkfrenchopenquote{\guillemotleft}}
@@ -1782,13 +2118,13 @@
{\mkfrenchclosequote{\guillemotright}}
\DeclareQuoteStyle[imprimerie]{french}
[\initfrenchquotes]
- [\seteverylineleft{\mkfrenchopenquote{\guillemotleft}}]
- {\mkfrenchopenquote{\guillemotleft}}
- [\mkfrenchopenquote{\guillemotleft}]
- {\mkfrenchclosequote{\guillemotright}}
- {\mkfrenchopenquote{\guillemotleft}}
+ [\seteverylineleft{\guillemotleft\nobreakspace}]
+ {\guillemotleft\nobreakspace}
+ [\guillemotleft\nobreakspace]
+ {\nobreakspace\guillemotright}
+ {\guillemotleft\nobreakspace}
[\relax]
- {\mkfrenchclosequote{\guillemotright}}
+ {\nobreakspace\guillemotright}
\DeclareQuoteStyle[quotes]{german}% verified
{\quotedblbase}
{\textquotedblleft}
@@ -1817,6 +2153,7 @@
{\guillemotleft}
[\textquotedblright]% ???
{\guillemotright}
+ [0.025em]
{\textquotedblleft}
{\textquotedblright}
\DeclareQuoteStyle[guillemets]{norwegian}
@@ -1831,6 +2168,12 @@
[0.05em]
{\quotesinglbase}
{\textquoteright}
+\DeclareQuoteStyle{spanish}
+ {\guillemotleft}
+ {\guillemotright}
+ [0.025em]
+ {\textquotedblleft}
+ {\textquotedblright}
\DeclareQuoteStyle[quotes]{swedish}% verified
{\textquotedblright}
{\textquotedblright}
@@ -1852,16 +2195,12 @@
{\csq@dummymark}
{\csq@dummymark}
-\def\csq@dummymark{\mbox{\kern0.1em\textbf{?}\kern0.1em}}
-\def\csq@errormark{\mbox{\kern0.1em\rule{1ex}{1ex}\kern0.1em}}
+\def\csq@dummymark{\textbf{?}}
+\def\csq@errormark{\rule{1ex}{1ex}}
% PDF strings
-\DeclarePlainStyle
- {\string"}
- {\string"}
- {\string'}
- {\string'}
+\DeclarePlainStyle{"}{"}{'}{'}
%% Built-in aliases
@@ -1891,32 +2230,49 @@
%% Package options
+\newcommand*{\ExecuteQuoteOptions}[1]{%
+ \begingroup
+ \let\if@safe@actives\iftrue
+ \edef\csq@tempa{\endgroup
+ \noexpand\setkeys{csq}{#1}}%
+ \csq@tempa}
+
+\AtBeginDocument{%
+ \def\ExecuteQuoteOptions#1{%
+ \csq@warn@location\ExecuteQuoteOptions}}
+
% Core options
\define@key{csq}{strict}[true]{%
- \expandafter\ifx\csname if#1\endcsname\iftrue
- \csq@info{Enabling strict warnings}%
- \csq@stricttrue
- \else
- \csq@info{Disabling strict warnings}%
- \csq@strictfalse
- \fi}
+ \csq@ifcsundefined{csq@opt@strict@#1}
+ {\csq@err@invldopt{strict=#1}}
+ {\@nameuse{csq@opt@strict@#1}}}
+\def\csq@opt@strict@true{%
+ \csq@info{Enabling strict warnings}%
+ \let\csq@warning\csq@warning@strict}
+\def\csq@opt@strict@false{%
+ \csq@info{Disabling strict warnings}%
+ \let\csq@warning\csq@warning@loose}
\define@key{csq}{babel}[true]{%
- \expandafter\ifx\csname if#1\endcsname\iftrue
- \csq@info{Enabling multilingual support}%
- \csq@resettrue
- \else
- \csq@info{Disabling multilingual support}%
- \csq@resetfalse
- \fi}
+ \csq@ifcsundefined{csq@opt@babel@#1}
+ {\csq@err@invldopt{babel=#1}}
+ {\@nameuse{csq@opt@babel@#1}}}
+\def\csq@opt@babel@true{%
+ \csq@info{Enabling multilingual support}%
+ \csq@resettrue
+ \csq@roncefalse}
+\def\csq@opt@babel@false{%
+ \csq@info{Disabling multilingual support}%
+ \csq@resetfalse
+ \csq@roncefalse}
+\def\csq@opt@babel@once{%
+ \csq@resetfalse
+ \csq@roncetrue}
\define@key{csq}{style}{%
- \csq@quiettrue
- \DeclareQuoteAlias{#1}{default}%
- \csq@quietfalse
- \csq@info{Disabling multilingual support}%
- \csq@resetfalse}
+ \csq@opt@babel@false
+ \DeclareQuoteAlias{#1}{default}}
% Language options
@@ -1937,10 +2293,10 @@
\csq@ifcsundefined{quote}
{\csq@info{%
The `quote' environment appears to be undefined.\MessageBreak
- I'm defining a typical `quote' environment now}%
+ I'm defining a typical `quote' environment now}
\def\quote{%
\list{}{\rightmargin\leftmargin}%
- \item\relax}%
+ \item\relax}
\def\endquote{\endlist}}
{}
@@ -1948,47 +2304,19 @@
\SetBlockThreshold{3}
\SetCiteCommand{\cite}
-% Load configuration file
-
-\csq@info{Trying to load configuration file `csquotes.cfg'..}
-
-\let\csq@tempa\ExecuteOptions
-\def\ExecuteOptions#1{\setkeys{csq}{#1}}
-
-\InputIfFileExists{csquotes.cfg}
- {\csq@info{... configuration file loaded successfully}}
- {\csq@info{... configuration file not used}}
-
-\let\ExecuteOptions\csq@tempa
-\let\csq@tempa\@undefined
-
-% Process options
-
-\DeclareOption*{%
- \begingroup
- \edef\csq@tempa{\endgroup
- \noexpand\setkeys{csq}{\CurrentOption}}%
- \csq@tempa}
-
-\ProcessOptions*
-
%% Last minute setup
\AtBeginDocument{%
- \csq@setstyle{default}%
- \let\do\csq@do@dospecial
- \csq@dospecials
- \let\do\csq@do@fixdelim
- \csq@dodelimiters
- \csq@activetrue
- \let\do\noexpand
\@ifpackageloaded{babel}
{\csq@mkbabel}
{\csq@mknobabel}%
+ \let\csq@mkbabel\@undefined
+ \let\csq@mknobabel\@undefined
\@ifpackageloaded{hyperref}
- {\let\csq@warn@pdfstrings\pdfstringdefWarn
- \csq@add\pdfstringdefPreHook{\csq@mkpdfstrings}}
- {\let\csq@warn@pdfstrings\@gobble}%
+ {\expandafter\pdfstringdefDisableCommands
+ \expandafter{\csq@mkhyperref}}
+ {}%
+ \let\csq@mkhyperref\@undefined
\csq@add\@noligs{\@verbatimquotes}%
\@ifpackageloaded{verbatim}
{\addto@hook\every@verbatim{\@verbatimquotes}}
@@ -1996,117 +2324,24 @@
\@ifpackageloaded{fancyvrb}
{\csq@add\FV@CatCodes{\@verbatimquotes}}
{}%
+ \csq@setstyle{default}%
+ \csq@mkenable
\csq@checkblockcite}
-\endinput
+% Load configuration file
-% AUTHOR INTERFACE
+\csq@info{Trying to load configuration file `csquotes.cfg'..}
+\InputIfFileExists{csquotes.cfg}
+ {\csq@info{... configuration file loaded successfully}}
+ {\csq@info{... configuration file not used}}
-% Controlling active quotes
+% Process options
-% This package provides three commands for class and package authors
-% who need to temporarily disable the active quotes for some reason.
-%
-% \@disablequotes
-%
-% This command restores the status quo ante of all active quotes.
-% This can mean one of two things:
-%
-% 1) If a character had been active when it was defined as active
-% quote, its previous definition will be restored.
-%
-% 2) If a character had not been active when it was defined as active
-% quote, its previous category code will be restored.
-%
-% Note that all active quotes are made active \AtBeginDocument hence
-% you will only need \@disablequotes if you're defining anything
-% \AtBeginDocument or later.
-%
-% \@restorequotes
-%
-% This command restores csquotes's definitions of all active quotes
-% and makes them active. The category codes of delimiter characters
-% (used for block quotes) are also restored if they have changed.
-%
-% All changes made by \@disablequotes and \@verbatimquotes are local
-% and may thus be restricted to a group. If you use proper grouping
-% you may omit \@restorequotes.
-%
-% The author commands \@restorequotes and \@disablequotes differ from
-% the user commands \RestoreQuotes and \DisableQuotes in two ways:
-%
-% 1) When used in the preamble, they will do nothing (the user
-% commands would issue a warning since the active quotes are not
-% yet defined at this point).
-%
-% 2) When used in the document body, they will essentially behave
-% like the user commands, except that all informational messages
-% are suppressed. The author commands will work quietly behind the
-% scenes.
-%
-% \@verbatimquotes
-%
-% For verbatim environments and comparable applications, use
-% \@verbatimquotes instead of \@disablequotes. \@verbatimquotes
-% redefines the active quotes in a way that it suitable for a
-% verbatim context. It will do the following:
-%
-% 1) If a character is in the Ascii range (character code <128), it
-% will be redefined so that it expands to itself with category
-% code 12.
-%
-% 2) If a character is not in the Ascii range, there are two
-% possibilities:
-%
-% a) If the character had been active when it was defined as
-% active quote, it will be redefined so that it expands to its
-% previous definition.
-%
-% b) If the character had not been active when it was defined as
-% active quote, it will be redefined so that it expands to
-% itself with its previous category code.
-%
-% In addition to that, all Ascii characters are added to LaTeX's
-% \dospecials list (which may override 1 above, but yield the same
-% result). Non-Ascii characters are not added to \dospecials and may
-% remain active, allowing the inputenc package to handle them in a
-% verbatim context (due to 2a above, which implies that inputenc must
-% be loaded before any active quotes are defined). Case 2b is usually
-% undesirable in a verbatim context. However, if inputenc is loaded
-% and the input encoding is declared properly, this will not happen.
-%
-% \@verbatimquotes is independent of any \dospecials processing. You
-% may typeset all active quotes verbatim by using \@verbatimquotes
-% exclusively. The advantage of \@verbatimquotes is that it does not
-% depend on any category code changes. In contrast to \dospecials and
-% \@makeother, the following is perfectly possible:
-%
-% \newcommand{\printverbquotes}[1]{{\@verbatimquotes #1}}
-%
-% Note that the standard LaTeX verbatim environments as well as all
-% environments defined by way of the verbatim and fancyvrb packages
-% are catered for automatically. When using an environment provided
-% by these packages or when defining new environments with the aid of
-% one of them, there is no need to add \@verbatimquotes explicitly.
-% This also applies to the \verb command and the shortvrb package.
-
-% Frontend to internal marks
-
-% In some cases it may be desirable to gain access to the internal
-% quotation marks of this package without any grouping or nesting
-% control. They may be accessed by way of the following commands:
-%
-% \textooquote opening outer quotation mark
-% \textmoquote middle outer quotation mark
-% \textcoquote closing outer quotation mark
-%
-% \textoiquote opening inner quotation mark
-% \textmiquote middle inner quotation mark
-% \textciquote closing inner quotation mark
-%
-% These commands will simply print the respective quotation mark as
-% defined with \DeclareQuoteStyle. Note that the initialization hooks
-% for the respective quotation style are not expanded in this case.
-% The internal marks will reflect all changes of the quotation style.
-% If the multilingual interface is enabled, they are also synced with
-% the current language.
+\DeclareOption*{%
+ \begingroup
+ \edef\csq@tempa{\endgroup
+ \noexpand\setkeys{csq}{\CurrentOption}}%
+ \csq@tempa}
+\ProcessOptions*
+
+\endinput