1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
%
% File: QUOTE.TEX
%
% Author: Hunter Goatley
% goathunter@goatley.com
%
% Date: August 14, 1991
%
% Abstract:
%
% This file defines the macros \begindoublequotes and \enddoublequotes,
% which let TeX replace the double-quote character (") with TeX's
% left double-quote and right double-quote. For example:
%
% "This is a test." ---> ``This is a test.''
%
% The double-quote character is still available via \dq. (\" is still
% treated as the umlaut accent.)
%
% This macro makes a couple of assumptions about the double-quotes:
%
% 1. Double-quotes are assumed to come in pairs. When replacing
% double-quotes, the macro alternates between `` and ''. The only
% exception to this is noted in (2) below.
% 2. A double-quote at the beginning of a paragraph is always treated
% as ``. This correctly handles the case where a quotation is
% continued into a second paragraph:
%
% "This is the first paragraph.\par
% "This is the second paragraph of the same quote."
%
% Normal TeX spacing after `` and '' is maintained by saving and
% restoring the \spacefactor.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% HOW IT WORKS:
%
% The double-quote character (") is made active by \begindoublequotes.
% The " macro keeps track of left-quote/right-quote pairs and inserts
% the appropriate `` and '' in its place.
%
% Each character has a \spacefactor associated with it, which specifies
% the amount of stretch or shrink that a space following the character
% can have. Most characters have a factor of 1000, but some punctuation
% marks have higher spacefactors, most notably the period, which has a
% \spacefactor of 3000. This means the space following a period can
% stretch up to 3 times more than the space after a regular character,
% accounting for the increased space at the end of sentences.
%
% The `` and '' ligatures are assigned \spacefactor's of 0, so that the
% \spacefactor that is applied to the next character is the same as that
% of the character preceding the quotes. Because " has been redefined as
% a macro, any spaces following " are swallowed by TeX. It was necessary
% to have this macro re-insert any needed space so that the following
% cases worked correctly:
%
% "This is a test," she said. --> ``This is a test,'' she said.
% "This is in a list"; etc. --> ``This is in a list''; etc.
%
% Without the added space, the first example becomes:
%
% ``This is a test,''she said.
%
% The solution was to save the current \spacefactor before inserting a
% right double-quote, then resetting the \spacefactor after the
% insertion. The net effect was that the " macro has a \spacefactor
% of 0, which matches the way TeX treats `` and ''.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{% % Begin a group for which " is active
\catcode`\"=\active % Make " an active character
\catcode`\@=11 % Make @ an active character
%
% \begindoublequotes
%
% This macro makes " an active character, resets the control sequence
% \dblqu@te to L (left), and defines \dq as a replacement for ".
%
\gdef\begindoublequotes{% % \begindoublequotes enables "
\global\catcode`\"=\active % Make " an active character
\global\chardef\dq=`\" % Double-quote char. via \dq
\global\let\dblqu@te=L % Always start with a left double-quote
} % End of macro
%
% Define the macro that will be executed whenever " is encountered.
%
\gdef"{%
% If the double-quote is the first character in a new paragraph,
% make sure it becomes a left double-quote. This case can be
% detected by checking to see if TeX is currently in vertical mode.
% If so, the double-quote is at the beginning of the paragraph
% (since " hasn't actually generated any horizontal mode tokens
% yet, TeX is still in vertical mode). If the mode is vertical,
% set \dblqu@te equal to L.
%
\ifinner\else\ifvmode\let\dblqu@te=L\fi\fi
%
% Now insert the appropriate left or right double-quote.
%
% If \dblqu@te is L, insert a `` and set \dblqu@te to R.
%
\if L\dblqu@te``\global\let\dblqu@te=R%
%
% Otherwise, save the current \spacefactor, insert '', set \dblqu@te
% to L, and reset the original \spacefactor.
%
\else
\let\xxx=\spacefactor % Save the \spacefactor
''\global\let\dblqu@te=L% % Insert '' and reset \dblqu@te
\spacefactor\xxx % Reset the \spacefactor
\fi % End of \if L\dblqu@te...
} % End of " macro
} % End of group
\gdef\enddoublequotes{%
\catcode`\"=12 %Set " back to other
}
|