Here's one solution using TikZ
which defines a new environment using the framed
package. You should preferably compile this with xelatex
or lualatex
, since it gives the easiest access to a wide range of fonts. I've added code to make it run under pdflatex
as well.
The code has now been updated to allow some flexibility in the formatting of the different components of the quotation, and the environment takes two arguments:
Environment Syntax
\begin{shadequote}[<alignment>]{<author>}
text of quote
\end{shadequote}
Code
% !TEX TS-program = xeLaTeX
\documentclass[12pt]{article}
\usepackage{ifxetex,ifluatex}
\usepackage{etoolbox}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usepackage{framed}
% conditional for xetex or luatex
\newif\ifxetexorluatex
\ifxetex
\xetexorluatextrue
\else
\ifluatex
\xetexorluatextrue
\else
\xetexorluatexfalse
\fi
\fi
%
\ifxetexorluatex%
\usepackage{fontspec}
\usepackage{libertine} % or use \setmainfont to choose any font on your system
\newfontfamily\quotefont[Ligatures=TeX]{Linux Libertine O} % selects Libertine as the quote font
\else
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{libertine} % or any other font package
\newcommand*\quotefont{\fontfamily{LinuxLibertineT-LF}} % selects Libertine as the quote font
\fi
\newcommand*\quotesize{60} % if quote size changes, need a way to make shifts relative
% Make commands for the quotes
\newcommand*{\openquote}
{\tikz[remember picture,overlay,xshift=-4ex,yshift=-2.5ex]
\node (OQ) {\quotefont\fontsize{\quotesize}{\quotesize}\selectfont``};\kern0pt}
\newcommand*{\closequote}[1]
{\tikz[remember picture,overlay,xshift=4ex,yshift={#1}]
\node (CQ) {\quotefont\fontsize{\quotesize}{\quotesize}\selectfont''};}
% select a colour for the shading
\colorlet{shadecolor}{Azure}
\newcommand*\shadedauthorformat{\emph} % define format for the author argument
% Now a command to allow left, right and centre alignment of the author
\newcommand*\authoralign[1]{%
\if#1l
\def\authorfill{}\def\quotefill{\hfill}
\else
\if#1r
\def\authorfill{\hfill}\def\quotefill{}
\else
\if#1c
\gdef\authorfill{\hfill}\def\quotefill{\hfill}
\else\typeout{Invalid option}
\fi
\fi
\fi}
% wrap everything in its own environment which takes one argument (author) and one optional argument
% specifying the alignment [l, r or c]
%
\newenvironment{shadequote}[2][l]%
{\authoralign{#1}
\ifblank{#2}
{\def\shadequoteauthor{}\def\yshift{-2ex}\def\quotefill{\hfill}}
{\def\shadequoteauthor{\par\authorfill\shadedauthorformat{#2}}\def\yshift{2ex}}
\begin{snugshade}\begin{quote}\openquote}
{\shadequoteauthor\quotefill\closequote{\yshift}\end{quote}\end{snugshade}}
\begin{document}
\begin{shadequote}[l]{Douglas Adams}
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
\end{shadequote}
\begin{shadequote}[r]{Douglas Adams}
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
\end{shadequote}
\begin{shadequote}[c]{Douglas Adams}
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
\end{shadequote}
\begin{shadequote}{}
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
\end{shadequote}
\end{document}
In this code, the font for the quotation marks is set independently of the main document font. This is because depending on the main font you choose, the very large quotation marks will not look good; Linux Libertine has pretty quotes that seem appropriate for the purpose. If you want to use this environment with another main document font, remove/change the \usepackage{libertine}
.
Sample output
I wouldn't use upquote
generally as normally it's better to use the quotes designed for the font you are using. If your keyboard makes typing left and right quotes difficult I would use your editor to change
"text"
to
\mydoubleq{text}
and
'text'
to
\mysingleq{text}
Then you can define those commands as
\def\mydoubleq#1{``#1''}
\def\mysingleq#1{`#1'}
so then you never need to type any of the quote characters (you can cut and paste the definitions from this page so you don't need the keyboard to enter those either).
Best Answer
Here's something that works for me. It is based on making the right single quote an active character in TeX. I must admit I have no confidence that this doesn't break something else, especially in the light of the negative comment by @egreg to the original question.
Let's start with an example that contains a number of quotations. The first line shows how we would like double quotes to appear.
Now, by adding the following lines to the preamble:
you can get what you want.
EDIT: After egreg's comment about this tweak breaking math that contains primes, like
$f'(x)$
, I'm providing a fix and concluding with a brief explanation and a disclaimer.The fix comes in two parts. First the active quote has to check whether it's found in math mode or text mode. Second, the internal macro
\pr@m@s
(handling successive primes in math mode) has to be repeated here (verbatim fromlatex.ltx
) because it checks whether the next character is'
and now it has to check for an active'
.Disclaimer: Making the single right quote an active character is expected to break everything that already treats it as an active character. Examples that cross my mind are: the
babel
package (some languages with accents), various math packages likeeuler
, various verbatim-text packages like thealltt
. But there are also packages, likexspace
which (temporarily) set the\catcode
of\'
to 13. I've testedeuler
,alltt
andxspace
and they seem to work fine with this. All this said, you have been warned. If a package breaks with this, I don't expect the fix to be obvious...