使用 BibLaTeX 分解长标题(包含文件路径)

使用 BibLaTeX 分解长标题(包含文件路径)

我目前正在尝试在没有空格可换行的长参考书目条目标题内获取换行符。

让我们假设我们有以下 MWE 及其最少的参考书目条目(这只是一个例子,真正的条目当然会有更多信息),它应该可以正确显示:

\documentclass{scrartcl}

\usepackage[%
    backend=biber,
    style=alphabetic,
]{biblatex}
\addbibresource{\jobname.bib}

\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@software{key,
  title = {Software repository: /usr/share/php/PHP/CodeSniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php},
  author = {Sherwood, Greg},
}
\end{filecontents}

\begin{document}

\cite{key}

\printbibliography

\end{document}

目前,整个参考书目条目在输出中只占一行,并且显示不完整。我认为拆分条目的最佳方法是使用其中一个斜线。

文件.bib本身是使用 Zotero 创建的,可能会被覆盖。我可以在 Zotero 中手动编辑标题(无法在多个文档之间移植)或修改导出的文件(以后可能会再次被覆盖),但在我看来,这些都不是最佳选择。

我能做些什么来解决这个问题而不需要手动修改文件.bib

答案1

url.sty我将根据\url文件路径定义一个新命令。

\documentclass{scrartcl}

\usepackage[%
    backend=biber,
    style=alphabetic,
]{biblatex}

\usepackage{url}
\newcommand*{\filepath}{}
\DeclareUrlCommand\filepath{\urlstyle{same}}

\begin{filecontents}{\jobname.bib}
@software{key,
  title  = {Software repository: \filepath{/usr/share/php/PHP/CodeSniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php}},
  author = {Sherwood, Greg},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\cite{key}

\printbibliography
\end{document}

Greg Sherwood。软件存储库:/usr/share/php/PHP/CodeSniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php

我知道这不符合“我不想修改文件.bib”的要求,但我认为在这种情况下这是最明智的做法。LaTeX 只需要一些标记来知道如何处理文件路径。除非您明确标记法语短语,否则您不会指望 LaTeX 在其他英语文档中按照法语规则对法语短语进行连字符处理。


如果您坚持要一个不更改文件的解决方案,.bib您可以使用 LuaLaTeX 运行以下命令。它会用/可拆分的斜线替换每个出现的 。

% !TeX program = LuaLaTeX
\documentclass{scrartcl}

\usepackage[%
    backend=biber,
    style=alphabetic,
]{biblatex}

\newcommand{\breakslash}{/\penalty\exhyphenpenalty\hspace{0pt}}

\usepackage{luacode}
\begin{luacode}
function replaceslash (s) 
   s = string.gsub (s, "/", "\\breakslash " )
   tex.sprint (s)
end
\end{luacode}
\newcommand{\replaceslash}[1]{\directlua{replaceslash(\luastringN{#1})}}

\DeclareFieldFormat{titlecase}{\replaceslash{#1}}

\begin{filecontents}{\jobname.bib}
@software{key,
  title  = {Software repository: /usr/share/php/PHP/CodeSniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php},
  author = {Sherwood, Greg},
}
\end{filecontents}
\addbibresource{\jobname.bib}


\begin{document}
\cite{key}

\printbibliography
\end{document}

或者很多很多更脆弱的是,一些代码假定以 开始/直到下一个空格的所有内容都是文件路径。

% !TeX program = LuaLaTeX
\documentclass{scrartcl}

\usepackage[%
    backend=biber,
    style=alphabetic,
]{biblatex}

\usepackage{url}
\newcommand*{\filepath}{}
\DeclareUrlCommand\filepath{\urlstyle{same}}

\usepackage{luacode}
\begin{luacode}
function replaceslash (s) 
   s = string.gsub (s, "(/[^%s]*)", "\\filepath{%1}" )
   tex.sprint (s)
end
\end{luacode}
\newcommand{\replaceslash}[1]{\directlua{replaceslash(\luastringN{#1})}}

\DeclareFieldFormat{titlecase}{\replaceslash{#1}}

\begin{filecontents}{\jobname.bib}
@software{key,
  title  = {Software repository: /usr/share/php/PHP/CodeSniffer/src/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php},
  author = {Sherwood, Greg},
}
\end{filecontents}
\addbibresource{\jobname.bib}


\begin{document}
\cite{key}

\printbibliography
\end{document}

相关内容