我想适应带大引号的块引用像我的母语德语这样的语言,还有一些其他主要是日耳曼语和斯拉夫语的语言(参见维基百科:引号的非英语用法),开盘报价位于底部。
基于Andrew Stacey 的回答以及 Werner Grundlingh 提出的引号符号的想法如何创建引言?我得到了如下所示的解决方案。
我的问题是:
我该如何改进此代码?就目前情况而言,字体更改时必须更改所有金额,有时需要手动更正,这必须依靠经验;要看到一些奇怪的效果,请注释掉下面环境的可选question
值(这与使用无关\blindtext
;我在实际使用中也遇到过这种情况,这实际上是引入校正值的原因)above
。此外,移入和移出的数量below
必须不同。至少开盘报价似乎并不总是完全相同,参见第一个和第二个示例。
也许你也有基于不同方法的想法。例如,也许有一种方法mdframed
,因为我无论如何都会使用它?
该环境的名称来源于这样的事实:其最初的用途仅用于提问。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{kpfonts}% package with fonts of Kepler project
% loads also package "textcomp"
\usepackage[ngerman]{babel}% new German spelling
\usepackage[svgnames]{xcolor}
\definecolor{framecolor}{named}{SteelBlue}
\colorlet{framebgcolor}{PowderBlue!50!White}
\definecolor{quotesignclr}{named}{LightSlateGrey}
\usepackage{changepage}% not needed with "memoir" and KOMA-Script classes or package "scrextend"
\usepackage{calc,etoolbox,environ,graphicx}
\usepackage[pangram]{blindtext}% for dummy text, needs "babel"
\usepackage{showframe}% just for showing the text margins
\usepackage{tikz}
\usetikzlibrary{backgrounds,positioning}
% based on answer of Andrew Stacey in https://tex.stackexchange.com/a/28418/9237
% model for quotes: Werner Grundlingh in https://tex.stackexchange.com/a/45828/9237
\newlength{\bodywidth}
\newlength{\testwidth}
\newlength{\nodewidth}
\newcommand*{\openingquote}{\llap{\smash{\makebox[1em][r]{\quotedblbase\hspace*{0.1em}}}}}
\newcommand*{\closingquote}{\rlap{\smash{\makebox[1em][l]{\hspace*{0.1em}\textquotedblleft}}}}
%-----%
\NewEnviron{question}[1][0pt]%
{\begingroup
\settowidth{\bodywidth}{\itshape\BODY}
\setlength{\testwidth}{2.5em+0.6pt+\bodywidth}% 2.5em = 2*inner frame xsep;
% 0.6pt = 2*line width+2*inner sep
\begin{adjustwidth}{3em}{3em}% with KOMA-Script use environment "addmargin" instead
\ifdimcomp{\testwidth}{<}{\linewidth}% "\ifdimcomp" provided by "etoolbox"
%true:
{\setlength{\nodewidth}{\bodywidth}\addtolength{\nodewidth}{-#1}}%
%false:
{\setlength{\nodewidth}{\linewidth}\addtolength{\nodewidth}{-2.5em-0.6pt-#1}}
\begin{tikzpicture}
[background rectangle/.style={draw=framecolor,line width=0.2pt,fill=framebgcolor,rounded corners},
show background rectangle,inner frame xsep=1.25em,inner frame ysep=0.5em]
% body text
\node[text width=\nodewidth ,align=justify,inner sep=0.1pt] (TXT) {\itshape\BODY};
% opening quote
\node[overlay,scale=2,text=quotesignclr,inner sep=0.1pt,above=0.25ex of TXT.south west]
(OpQ) {\openingquote};
%closing quote
\node[overlay,scale=2,text=quotesignclr,inner sep=0.1pt,below=2.75ex of TXT.north east]
(ClQ) {\closingquote};
\end{tikzpicture}
\end{adjustwidth}}[\endgroup]
\begin{document}
% German quote signs --> German dummy text
\begin{question}
% text is extracted from package "blindtext"
Dies hier ist ein Blindtext zum Testen von Textausgaben.
Wer diesen Text liest, ist selbst schuld.
\end{question}
\begin{question}
\blindtext[1]
\end{question}
\begin{question}[-0.7em]
\blindtext[1]
\end{question}
\begin{question}[-5em]
\blindtext[1]
\end{question}
\begin{question}
\blindtext[1]
\end{question}
\begin{question}[10.6em]
\blindtext[1]
\end{question}
\end{document}
答案1
这是使用一些低级命令的提议。文本以 a 排版\vtop
,其深度用于放置开头的引号,而结尾的引号将与顶行齐平(由于尺寸原因会降低一些)。
感谢 Jake,我已经能够解决一个困扰我的谜团,关于一个似乎是必要的间距,这是由于inner sep
TikZ 节点造成的。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{kpfonts}
\usepackage[svgnames]{xcolor}
\definecolor{framecolor}{named}{SteelBlue}
\colorlet{framebgcolor}{PowderBlue!50!White}
\definecolor{quotesignclr}{named}{LightSlateGrey}
\usepackage{changepage}
\usepackage{environ,graphicx}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\newcommand\sopeningquote{\scalebox{2}{\color{quotesignclr}\smash\quotedblbase}}
\newcommand\sclosingquote{\scalebox{2}{\color{quotesignclr}\smash\textquotedblleft}}
\makeatletter
\newsavebox\simplequestbox
\NewEnviron{simplequest}{%
\normalfont
\begin{adjustwidth}{3em}{3em}
\settowidth{\dimen@}{\sopeningquote\kern.4em\sclosingquote}%
\dimen@=\dimexpr\linewidth-\dimen@\relax
\setbox\simplequestbox=\vtop{
\@parboxrestore\itshape
\hsize=\dimexpr\dimen@-\pgfkeysvalueof{/pgf/inner xsep}*2\relax % thanks, Jake
\sbox\z@{\BODY}
\ifdim\wd\z@>\hsize
\noindent\BODY\par
\else
\box\z@
\fi
\xdef\simplequestpd{\the\prevdepth}
}
\begin{tikzpicture}
[background rectangle/.style={draw=framecolor,line width=0.2pt,
fill=framebgcolor,rounded corners}, show background rectangle,
inner frame xsep=-2pt,inner frame ysep=2pt]
\node {\mbox{%
\raisebox{\dimexpr-\dp\simplequestbox+\simplequestpd+.05ex}
[0pt][0pt]{\sopeningquote}%
\kern.2em
\box\simplequestbox
\kern.2em
\raisebox{-1.4ex}[0pt][0pt]{\sclosingquote}}};
\end{tikzpicture}
\end{adjustwidth}
}
\makeatother
\begin{document}
\begin{simplequest}
Dies hier ist ein Blindtext zum Testen von Textausgaben.
Wer diesen Text liest, ist selbst schuld.
\end{simplequest}
\begin{simplequest}
Dies hier ist ein Blindtext
\end{simplequest}
\Large
\begin{simplequest}
Dies hier ist ein Blindtext zum Testen von Textausgaben.
Wer diesen Text liest, ist selbst schuld.
\end{simplequest}
\end{document}
图中类似的引语是:顶部是我的,底部是你的。
如果文本包含多个段落,并且第一个段落的长度不足以填满一行,则可能会出现问题。 如果文档中出现这种情况,则代码可能会更改如下:
\makeatletter
\newsavebox\simplequestbox
\NewEnviron{simplequest}[1][]{%
\normalfont
\begin{adjustwidth}{3em}{3em}
\settowidth{\dimen@}{\sopeningquote\kern.4em\sclosingquote}%
\dimen@=\dimexpr\linewidth-\dimen@\relax
\setbox\simplequestbox=\vtop{
\@parboxrestore\itshape
\hsize=\dimexpr\dimen@-\pgfkeysvalueof{/pgf/inner xsep}*2\relax % thanks, Jake
\if\relax\detokenize{#1}\relax
\sbox\z@{\BODY}
\ifdim\wd\z@>\hsize
\noindent\BODY\par
\else
\box\z@
\fi
\else
\sbox\z@{#1}
\hsize\wd\z@
\BODY\par
\fi
\xdef\simplequestpd{\the\prevdepth}
}
\begin{tikzpicture}
[background rectangle/.style={draw=framecolor,line width=0.2pt,
fill=framebgcolor,rounded corners}, show background rectangle,
inner frame xsep=-2pt,inner frame ysep=2pt]
\node {\mbox{%
\raisebox{\dimexpr-\dp\simplequestbox+\simplequestpd+.05ex}
[0pt][0pt]{\sopeningquote}%
\kern.2em
\box\simplequestbox
\kern.2em
\raisebox{-1.4ex}[0pt][0pt]{\sclosingquote}}};
\end{tikzpicture}
\end{adjustwidth}
}
\makeatother
环境现在有一个可选参数,即第一行短线;这是一个例子:
\begin{simplequest}[Dies hier ist ein Blindtext.]
Dies hier ist ein Blindtext.
Wer diesen Text liest, ist selbst schuld.
\end{simplequest}
可以尝试仅获取第一段,但这可能容易出错。