我想知道编辑器字段值的第一个字符是什么。如果字符是花括号“{”,则应打印该值(例如粗体),如果第一个字符是其他字符,则应打印字段值\textnormal
。
我尝试使用包 xstring 和 biblatex 声明中的以下代码来做到这一点:
\IfBeginWith{editor}{\{}{\textbf{\printfield{editor}}}{\printfield{editor}}
但这不会改变任何东西。该怎么做才正确?
答案1
看来您应该了解 中的数据类型biblatex
;editor
是名称列表类型,而不是字段类型。 有关如何访问名称列表中的数据的一些详细信息,请参阅 上的文档\DeclareNameFormat
。 您使用 的方法是正确的xstring
,但在传递参数时需要更加小心。
以下代码将以biblatex
粗体打印出任何公司编辑器(即任何括在括号中的编辑器名称 - 请参阅手册第 2.3.3 节,版本 1.4b)。我已经对通用biblatex
格式和宏定义进行了编辑,但根据您使用的样式,此解决方案可能需要进行调整。
\documentclass{article}
\usepackage[style=authoryear]{biblatex}
\usepackage{xstring}
\usepackage{filecontents}
\DeclareNameFormat{byeditor}{% Based on first-last format from biblatex.def
\iffirstinits
{\usebibmacro{ename:first-last}{#1}{#4}{#5}{#7}}
{\usebibmacro{ename:first-last}{#1}{#3}{#5}{#7}}%
\usebibmacro{name:andothers}}
\newbibmacro*{ename:first-last}[4]{% Basd on name:first-last macro from biblatex.def
\usebibmacro{name:delim}{#2#3#1}%
\usebibmacro{name:hook}{#2#3#1}%
\ifblank{#2}{}{\mkbibnamefirst{#2}\isdot\bibnamedelimd}%
\ifblank{#3}{}{%
\mkbibnameprefix{#3}\isdot
\ifpunctmark{'}
{}
{\ifuseprefix{\bibnamedelimc}{\bibnamedelimd}}}%
\noexpandarg\StrRemoveBraces{#1}[\mycsnb]%
\noexpandarg\StrFindGroup{#1}{1}[\mycsfg]%
\ifblank{#2#3#4}
{\ifdefstring{\mycsnb}{#1}
{\mkbibnamelast{#1}}
{\ifdefstring{\mycsfg}{#1}{\mkbibbold{#1}}{\mkbibnamelast{#1}}}}
{\mkbibnamelast{#1}}\isdot
\ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}}
\begin{filecontents}{\jobname.bib}
@Book{companion,
author = {Goossens, Michel and Mittelbach, Frank and Samarin, Alexander},
title = {The LaTeX Companion},
edition = {1},
editor = {{Corporate Editor} and {A}ristotle and \texttt{HAL}},
publisher = {Addison-Wesley},
location = {Reading, Mass.},
date = {1994}}
@Article{gillies,
author = {Gillies, Alexander and {Corporate Author}},
title = {Herder and the Preparation. Goethe's Idea of World Literature},
journaltitle = {Publications of the English Goethe Society},
volume = {9},
date = {1933},
editor = {Lastname, Firstname and {Corporate Editor} and {Corporation}},
pages = {46--67}}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
关于代码的一些注释:
- 公司名称传递给姓氏参数(始终为 #1)。所有其他名称参数(例如名字、名称前缀等)均为空。
- 括号内的字符串无法
xstring
进行任何直接的字符串比较。我改用其他命令来检测公司名称xstring
。 \ifdefstring
测试控制序列是否等于字符串。此测试来自etoolbox
包,由 加载biblatex
。