更新 4

更新 4

我正在寻找一种方法来自动将引号与句号和逗号重叠,如下面示例图的最后两行所示。到目前为止,我发现的方法都是通过宏来实现的;我希望完全自动地完成此操作,而不在\begin和中添加任何内容\end {document},并且理想情况下还可以处理自动生成的文本,例如参考书目。

有这个软件包吗?或者有办法在普通的 LaTeX 宏中实现愚蠢的查找/替换功能吗?

\documentclass{minimal}

\begin{document}

``quoted.''

``quoted''.

``quoted\rlap{.}''

``quoted\rlap{''}.

\end{document}

pdf output

更新 4

现在我找到了一种不依赖任何任意长度的方法。句号/逗号和引号完全重叠,构造后的空格似乎与引号后的空格相同(双引号或单引号)。

下一个参考书目字段的首字母大写,无需添加另一个句点\nopunct\printunit{\bibsentence}。对我来说,这是一种反复试验的黑魔法,但到目前为止,它对我的​​目的有效。

update 4 pdf output

\documentclass{article}
\usepackage[american]{babel}
\usepackage[autostyle=true,autopunct=true]{csquotes}
\usepackage{biblatex}
\addbibresource{example.bib}

\begin{filecontents}{example.bib}
@incollection{smith:title,
    title = {The Title of the Part},
    author = {Smith, John},
    year = {2017},
    booktitle = {The Containing Book},
    publisher = {Some Publisher},
}

\end{filecontents}

\makeatletter

\DeclareQuotePunctuation{.,}
\DeclareAutoPunct{,.}

\DeclareFieldFormat%
        [article,inbook,incollection,inproceedings,patent,thesis,unpublished]%
        {title}{\textquote{#1}.\nopunct\printunit{\bibsentence}\addspace}

\renewcommand*{\mktextquote}[6]{#1#2#4{%
        \ifx#5.%
                \ifpunct{}{\rlap{#5}}%
        \else%
                \ifx#5,%
                        \ifpunct{}{\rlap{#5}}%
                \else%
                \fi%
        \fi%
        }#3#6%
}

\makeatother

\begin{document}

here are the \verb+\textquote+'s

``Hello. A kerning test.

``Hello'' A kerning test.

\textquote{Hello}. A kerning test.

\textquote{Hello.} A kerning test.

``Hello, A kerning test.

``Hello'' A kerning test.

\textquote{Hello}, A kerning test.

\textquote{Hello,} A kerning test.

\textcite{smith:title} is saying \textquote{a thing}.

\printbibliography

\end{document}

更新 3

我离目标越来越近了。到目前为止,我发现的唯一警告是,\textquote{}对于普通文本,您需要使用 而不是 `` 。感叹号等现在似乎可以正常工作。

\documentclass{article}
\usepackage[american]{babel}
\usepackage[autostyle=true,autopunct=true]{csquotes}
\usepackage{biblatex}
\addbibresource{example.bib}

\begin{filecontents}{example.bib}
@incollection{smith:title,
    title = {The Title of the Part},
    author = {Smith, John},
    year = {2017},
    booktitle = {The Containing Book},
    publisher = {Some Publisher},
}

\end{filecontents}

\makeatletter

\DeclareQuotePunctuation{.,}
\DeclareAutoPunct{,.}

\DeclareFieldFormat
  [article,inbook,incollection,inproceedings,patent,thesis,unpublished]
  {title}{\textquote{#1}.\nopunct}

\renewcommand{\mktextquote}[6]{#1#2#4{%
    \ifx#5.%
        \ifpunct{}{\rlap{#5}}%
    \else%
        \ifx#5,%
            \ifpunct{}{\rlap{#5}}%
        \else%
        \fi%
    \fi%
    }#3#6%
}

\makeatother

\begin{document}

here are the \verb+\textquote+'s

``Hello. A kerning test.

``Hello'' A kerning test.

\textquote{Hello}. A kerning test.

\textquote{Hello.} A kerning test.

``Hello, A kerning test.

``Hello'' A kerning test.

\textquote{Hello}, A kerning test.

\textquote{Hello,} A kerning test.

\textcite{smith:title} is saying \textquote{a thing}.

\printbibliography

\end{document}

更新 2

我对此取得了一些进展,尽管它与\adddot在第 153 行定义的和类似的命令有一些奇怪的错误biblatex.def

\documentclass{article}
\usepackage[brazilian]{babel}
\usepackage[autostyle=true,autopunct=true]{csquotes}
\usepackage{biblatex}
\addbibresource{example.bib}

\begin{filecontents}{example.bib}
@inbook{smith2017,
    title = {The Title of the Part},
    author = {Smith, John},
    booktitle = {The Containing Book},
}
\end{filecontents}

\makeatletter

% original definition of textquote from csquotes, applied to enquote as well
\renewrobustcmd*{\enquote}{%
  \@ifstar
    {\csq@getcargs{\csq@tquote{}{}{\csq@iqopen@i}}}
    {\csq@getcargs{\csq@tquote{}{}{\csq@oqopen@i}}}}

% from biblatex.sty but replaced enquote with textquote
\renewrobustcmd*{\mkbibquote}{\textquote}
\protected\def\blx@imc@mkbibquote{%
  \blx@ifuspunct\blx@usquote\textquote}

\newcommand\EatDot[2]{}
\DeclareFieldFormat[inbook]{title}{\textquote{#1}.\printunit{\space}}

\uspunctuation
\DeclareAutoPunct{.,}
\DeclareQuotePunctuation{.,}
\renewcommand{\mktextquote}[6]{#1#2#4{%
    \ifx#5.%
        \rlap{#5}%
    \else%
        \ifx#5,%
            \rlap{#5}%
        \else%
        \fi%
    \fi%
    }#3#6%
}

\makeatother

\begin{document}

here are the \verb+\textquote+'s

``Hello. A kerning test.

``Hello'' A kerning test.

\textquote{Hello}. A kerning test.

\textquote{Hello.} A kerning test.

``Hello, A kerning test.

``Hello'' A kerning test.

\textquote{Hello}, A kerning test.

\textquote{Hello,} A kerning test.

\textcite{smith2017} is saying \textquote{a thing}.

\printbibliography

here are the \verb+\enquote+'s

``Hello. A kerning test.

``Hello'' A kerning test.

\enquote{Hello}. A kerning test.

\enquote{Hello.} A kerning test.

``Hello, A kerning test.

``Hello'' A kerning test.

\enquote{Hello}, A kerning test.

\enquote{Hello,} A kerning test.

\end{document}

更新 1

除了单引号上的一些令人困惑的间距错误,以及下面示例图片中的第 4 行和第 8 行不起作用之外,我越来越接近了。棘手的部分是双引号,因为它由三个字符而不是两个字符组成,因此\@ifnextchar毫无用处(?)。

\documentclass{minimal}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\makeatletter

\let\normalperiod=.%
\catcode`\.=\active
\let\normalcomma=,%
\catcode`\,=\active
\let\normalquote='%
\catcode`\'=\active

\let\tqdr=\textquotedblright%

\def.{\@ifnextchar'{\rlap{\normalperiod{}}}{\normalperiod{}}}
\def,{\@ifnextchar'{\rlap{\normalcomma{}}}{\normalcomma{}}}

\def¶#1{}% removes the character following it, useful to remove the extraneous
         % single quote after the double quote gets substituted

\def'{%
    \@ifnextchar.{%
    \rlap{\textquoteright{}}%
    } {%
    \@ifnextchar,{%
        \rlap{\textquoteright{}}%
    } {%
        \@ifnextchar'{%
        \textquotedblright{}¶%
        } {%
        \textquoteright{}%
        }%
    }%
    }%
}%

\makeatother

\begin{document}

`This is a quote.' and this is some text

`This is a quote'. and this is some text

``This is a quote.'' and this is some text

``This is a quote''. and this is some text

`This is a quote,' and this is some text

`This is a quote', and this is some text

``This is a quote,'' and this is some text

``This is a quote'', and this is some text

`This is a quote?' and this is some text

`This is a quote'? and this is some text

``This is a quote?'' and this is some text

``This is a quote''? and this is some text

``This is a quote'' and this is some text

`This is a quote' and this is some text

\end{document}

pdf output update

答案1

以下示例适用于 LuaLaTeX(TeXlive 2016 中的 0.95 版本):

\documentclass{minimal}
\directlua{
fonts.handlers.otf.addfeature {
    name = "kern1",
    {
        type = "pair",
        data = {
            [0x002E] = {
                [0x201D] = { false, { -45, 0, -45, 0 } },
                [0x2019] = { false, { -45, 0, -45, 0 } },
            },
        }
    }
}
}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}[Ligatures=TeX,RawFeature=+kern1]
\begin{document}
``quoted.''
`quoted.'
\end{document}

它基于这个问题并在句号和结束引号之间添加一些负字距。我不知道是否可以使用一些相对尺寸,例如字符的宽度,因此通过反复试验选择了 -45。结果如下所示:

period-quote kerns

答案2

如果您已更新luaotfload(至 2.8 版本),这将提供所需的结果:

\documentclass{article}
\usepackage{fontspec}
\directlua
{
  fonts.handlers.otf.addfeature
  {
    name = "pkrn",
    type = "kern",
    data =
        {
           ["comma"] = { ["quotedblright"] = -250 , ["quoteright"] = -250 },
           ["period"] = { ["quotedblright"] = -100 , ["quoteright"] = -100 },
        },
  }
}
\setmainfont{Latin Modern Roman}[
  RawFeature={+pkrn}]
\begin{document}
“quoted,” “quoted.” ‘quoted,’ ‘quoted.’
\end{document}

output of example

standalone课堂上,或许在其他课堂上,除非你添加,否则这将产生错误\RequirePackage{luatex85}

答案3

警告通知:请自行承担风险使用,它可能会破坏csquotes软件包中其他潜在的良好功能,并且我认为引号后的间距可能会出现问题...

\documentclass{article}

\usepackage[english]{babel}
\usepackage[autostyle=true,autopunct=true]{csquotes}

\DeclareAutoPunct{.,}

% {<qopen>}{<text>}{<qclose>}{<punct>}{<apunct>}{<cite>}
\renewcommand{\mktextquote}[6]{#1#2#4#5%
\if#5.
    \kern-0.75em%
\fi%
\if#5,
    \kern-0.65em%
\fi%
#3#6}

\begin{document}

\textquote{quoted} normal text

\textquote{quoted}, next sentance

\textquote{quoted}. Next sentance

\end{document}

enter image description here

答案4

这将使用较少使用的"字符作为活动字符来触发与下一个字符的叠加。因此,它有几个限制:它必须作为".而不是进行.";并且它必须作为",而不是 进行'',

\documentclass{article}
\usepackage{stackengine}
\let\svdq"
\catcode`"=\active
\def"#1{\stackengine{0pt}{#1}{''}{O}{l}{F}{F}{L}}
\begin{document}
``quoted".

``quoted",
\end{document}

enter image description here

相关内容