Как определяется "заглавный регистр" в bibtex? Какой список словнетдля заглавных букв, и в каком файле это определено? Можно ли это изменить? Я проверил файл .bst
, но, по-видимому, это делегировано функции change.case
, определение которой я не могу найти.
решение1
Насколько мне известно, BibTeX не существует (и вообще не существует).biblatex
стиля BibTeX (или любого другого), который бы реализовывал макрос/функцию «преобразовать в заглавные буквы» (былвопрос некоторое время назад о том, как этого добиться сbiblatex
, ответ показывает способ начать работу с таким макросом в biblatex
Biber).
Однако есть функция для перевода заголовков в регистр предложений (первая буква первого слова заглавная, остальные строчные). Использование этой функции зависит от стиля. Если ваш стиль применяет регистр предложений, вы, вероятно, найдете такую строку в .bst
файле title "t" change.case$
.
Поэтому правила таковы: в файле заголовки следует указывать с заглавной буквы .bib
, а в стиле библиографии при желании преобразовывать их в заглавные буквы (см.Какой регистр следует использовать при сохранении названий в библиографической базе данных?).
В общем случае заголовки в .bib
файлах всегда следует давать с заглавной буквы, а также слова, которыевсегда должны быть написаны с заглавной буквыопределенным образом (имена, аббревиатуры, формулы и т. д.) заключаются в фигурные скобки {}
.
Пример
title = {From {Brouwer} to {Hilbert}: {The} Debate on the Foundations of Mathematics in the 1920s}
title = {{NASA} Ends Unmanned Launchings in {Florida}}
Смотрите такжеBibTeX теряет заглавные буквы при создании файла .bbl, особенноответ Алексиса.
решение2
Встроенная change.case$
функция описана в исходнике ( texk/bibtex-x/bibtex-4.c
в TeX Live):
* The |built_in| function change.case$ pops the top two (string)
* literals; it changes the case of the second according to the
* specifications of the first, as follows. (Note: The word `letters' in
* the next sentence refers only to those at brace-level~0, the top-most
* brace level; no other characters are changed, except perhaps for
* special characters, described shortly.) If the first literal is the
* string t, it converts to lower case all letters except the very
* first character in the string, which it leaves alone, and except the
* first character following any |colon| and then nonnull |white_space|,
* which it also leaves alone; if it's the string l, it converts all
* letters to lower case; if it's the string u, it converts all
* letters to upper case; and if it's anything else, it complains and
* does no conversion. It then pushes this resulting string. If either
* type is incorrect, it complains and pushes the null string; however,
* if both types are correct but the specification string (i.e., the
* first string) isn't one of the legal ones, it merely pushes the second
* back onto the stack, after complaining. (Another note: It ignores
* case differences in the specification string; for example, the strings
* t and T are equivalent for the purposes of this |built_in|
* function.)
Это сложно, и я не понял большую часть, но на практике, я думаю, что нужно помнить, что даже после знаков препинания, таких как «.», «!» или «?», буквы по умолчанию преобразуются в строчные... за исключением «:» (двоеточие). Действительно,
title = {Test! Test? Test: Test. Test, Test}
в файле .bib выводится:
\newblock Test! test? test: Test. test, test.
Это единственное исключение довольно странное и неожиданное.
решение3
Это можно сделать следующим образом, если вы готовы создать пользовательский файл .bst. В вашем документе вам понадобятся следующие строки:
\usepackage{titlecaps}
\Addlcwords{the of into}
где \usepackage
использует titlecaps
пакет, который имеет \titlecap
макрос. \Addlcwords
Макрос предоставляет список слов, которые должны оставаться строчными и не должны быть заглавными.
В вашем .bst
файле вам необходимо добавить новый макрос:
FUNCTION {titlecap}
{ duplicate$ empty$
{ pop$ "" }
{ "\titlecap{" swap$ * "}" * }
if$
}
Осталось только использовать его для различных стилей документа, которые вы форматируете. Например, строка в вашем стиле могла бы быть такой:
title ". " * output
который печатает заголовок, конкатенирует точку и выводит результат. Теперь вы бы отредактировали это так:
title titlecap ". " * output
который сначала применит titlecap
макрос к title
, перед объединением точки и выводом результата. вызов \titlecap
в макросе сделает заглавной первую букву каждого слова, за исключением тех, которые находятся в списке исключений. См. документацию пакета по адресуhttp://ctan.org/pkg/titlecaps.