制表符中的直引号

制表符中的直引号

我需要使用制表环境和 \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}

相关内容