我需要使用制表环境和 \sffamily 显示源代码。(请注意,由于我无法动态设置制表位,因此我不能使用列表或逐字记录)。
我为此定义了一个环境 sftabbing。一个最小工作示例如下
\documentclass{article}
\newenvironment{sftabbing}
{\par\sffamily\small\tabbing}
{\endtabbing\par}
\begin{document}
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES ('Federal Express', '02 752 75 75') \\ \\
UPDATE \= Shippers \\
SET \> CompanyName='Fedex' \\
WHERE \> CompanyName='Federal Express' \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = 'Germany' AND D.ProductID = P.ProductID )
\end{sftabbing}
\end{document}
但是,在这种情况下,引号会变成弯引号,而我需要它们保留为直引号。如何实现这一点?
我知道 upquote 软件包可以在 verbatim 环境中实现这一点。
顺便问一下,有没有什么方法可以改善我的环境的定义,这样我就不需要写入\\
来更改行了?
答案1
您可以使用textcomp
具有直引号字形的字形并在本地激活引号字符,以便它产生该字形。
\documentclass{article}
\usepackage{textcomp}
\newenvironment{sftabbing}
{\par
% locally define the active quote
\begingroup\lccode`~=`' \lowercase{\endgroup\let~}\textquotesingle
% locally activate the quote
\catcode`'=\active
\sffamily\small\tabbing}
{\endtabbing\par}
\begin{document}
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES ('Federal Express', '02 752 75 75') \\ \\
UPDATE \= Shippers \\
SET \> CompanyName='Fedex' \\
WHERE \> CompanyName='Federal Express' \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = 'Germany' AND D.ProductID = P.ProductID )
\end{sftabbing}
\end{document}
对于双引号,最好的方法是
\usepackage[T1]{fontenc}
这样"
就可以了。但是,如果你有理由不这样做,这里有一个解决方法:
\documentclass{article}
\usepackage[T1,OT1]{fontenc} % keep OT1 as default
\usepackage{textcomp}
\newenvironment{sftabbing}
{\par
% locally define the active quote
\begingroup\lccode`~=`' \lowercase{\endgroup\let~}\textquotesingle
\begingroup\lccode`~=`" \lowercase{\endgroup\def~}{{\fontencoding{T1}\selectfont\textquotedbl}}
% locally activate the quote
\catcode`'=\active \catcode`"=\active
\sffamily\small\tabbing}
{\endtabbing\par}
\begin{document}
Quotes: "
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES ('Federal Express', "02 752 75 75") \\ \\
UPDATE \= Shippers \\
SET \> CompanyName='Fedex' \\
WHERE \> CompanyName='Federal Express' \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = 'Germany' AND D.ProductID = P.ProductID )
\end{sftabbing}
\end{document}
但请注意,使用"
获取花括号结尾的引号从一开始就是有争议的。请参阅为什么这个“(一个符号)也可以用作双引号
答案2
您可以使用upquote
用 进行封装\textquotesingle
。由于输入起来比较麻烦,\textquotesingle
我通常会定义一个较短的命令,例如\upsq
下面示例中的命令:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{upquote}
\newcommand*{\upsq}[1]{\textquotesingle #1\textquotesingle}
\newenvironment{sftabbing}
{\par\sffamily\small\tabbing}
{\endtabbing\par}
\begin{document}
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES (\upsq{Federal Express}, \upsq{02 752 75 75}) \\ \\
UPDATE \= Shippers \\
SET \> CompanyName=\upsq{Fedex} \\
WHERE \> CompanyName=\upsq{Federal Express} \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = \upsq{Germany} AND D.ProductID = P.ProductID )
\end{sftabbing}
\end{document}
得出的结果为:
答案3
阅读包的文档upquote
表明,对于标准 CM 字体,\ttfamily\char13
已经产生了所需的字形,所以我只需将其'
激活并重新定义它。
已编辑,以便直接报价仅在环境中有效sftabbing
,然后恢复正常报价。
编辑包括cmap
允许从 PDF 中正确剪切/粘贴引号字符的包(参见无法从我的 PDF 中复制粘贴。知道原因吗?)
为那些cmap
该方法不起作用的人添加了附录。
\RequirePackage{cmap}
\documentclass{article}
\newenvironment{sftabbing}
{\par\sffamily\small\squoteon\tabbing}
{\endtabbing\squoteoff\par}
\let\svquote'
\catcode`'=\active
\def\squoteon{\catcode`'=\active%
\def'{\setbox0=\hbox{\ttfamily\char13}\raisebox{1pt}{\box0}}}
\def\squoteoff{\catcode`'=12\let\'\svquote}
\catcode`'=12
\begin{document}
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES ('Federal Express', '02 752 75 75') \\ \\
UPDATE \= Shippers \\
SET \> CompanyName='Fedex' \\
WHERE \> CompanyName='Federal Express' \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = 'Germany' AND D.ProductID = P.ProductID )
\end{sftabbing}
Test's of quote
\end{document}
飞涨:
textcomp
为了进行比较,由该包激活的直接报价在\sffamily
看起来像一个矩形块,这可能更符合科幻风格,但我觉得不太有吸引力:
因此我选择保留\ttfamily
引号字符的外观。
附录:
对于那些cmap
无法通过此软件包轻松使用 PDF 复制/粘贴功能的人来说,这里有另一种“字形转 Unicode”方法。这两种方法对我来说都适用,但原作者对这种cmap
方法感到困惑。
\documentclass{article}
\newenvironment{sftabbing}
{\par\sffamily\small\squoteon\tabbing}
{\endtabbing\squoteoff\par}
\let\svquote'
\catcode`'=\active
\def\squoteon{\catcode`'=\active%
\def'{\setbox0=\hbox{\ttfamily\char13}\raisebox{1pt}{\box0}}}
\def\squoteoff{\catcode`'=12\let\'\svquote}
\catcode`'=12
\pdfgentounicode=1 %
\input glyphtounicode.tex %
\begin{document}
\begin{sftabbing}
INSERT \= INTO Shippers(CompanyName, Phone) \\
\> VALUES ('Federal Express', '02 752 75 75') \\ \\
UPDATE \= Shippers \\
SET \> CompanyName='Fedex' \\
WHERE \> CompanyName='Federal Express' \\ \\
SELECT \> ProductID, ProductName \\
FROM \> Products P \\
WHERE \> EXISTS ( \\
\> SELECT \= * \\
\> FROM \> Orders O JOIN Customers C ON \\
\> \> O.CustomerID = C.CustomerID JOIN \\
\> \> OrderDetails D ON O.OrderID = D.OrderID \\
\> WHERE \> C.Country = 'Germany' AND D.ProductID = P.ProductID )
\end{sftabbing}
Test's of quote
\end{document}