abntex / abntex2

:books: Classe LaTeX e estilo bibliográfico compatíveis com as normas da ABNT
http://www.abntex.net.br
LaTeX Project Public License v1.3c
1.05k stars 218 forks source link

abnTeX2 com BibLaTeX emite título "Bibliografia" ao invés de "Referências" #200

Open ggabriel96 opened 6 years ago

ggabriel96 commented 6 years ago

abnTeX2 com BibLaTeX emite título "Bibliografia" ao invés de "Referências"

Sistema Operacional: Fedora 28 latex --version: pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017) Versão do abnTeX2: 2016/02/26 v-1.9.6 Versão do Memoir: 2016/05/16 v3.7f Versão do BibLaTeX: 2016/09/17 v3.6 Versão do Biber: 2.6 Customização: na verdade, descobri o problema por estar escrevendo uma customização (uffstex).

Descrição do problema

Apesar do abnTeX2 emitir o comando \renewcommand{\bibname}{Refer\^encias} dentro do \addto\captionsbrazil, ao utilizá-lo com o BibLaTeX o valor do comando \bibname não é respeitado. E por mais que executemos o \renewcommand novamente, nada muda. Não consegui descobri porquê... há várias discussões na internet sobre Memoir + BibLaTeX, mas nada muito conclusivo. Pode ser algo com o Babel também, mas não faço ideia.

Além disso, vale notar que o abnTeX2 implementa o título das referências através de um \renewcommand{\bibsection}. Porém, a documentação do BibLaTeX diz para utilizarmos o comando \defbibheading (apesar de não relacionada, veja o início da primeira resposta dessa pergunta; na documentação mais recente, entretanto, a seção que explica isso é 3.14.2).

MWE

Um exemplo de código "mínimo" pra reproduzir o problema é o seguinte:

\documentclass[12pt,openright,twoside,a4paper,brazil]{abntex2}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[style=abnt]{biblatex}

\addbibresource{refs.bib}

\autor{Autor}
\titulo{Título}
\instituicao{Instituição}
\orientador{Orientador}
\local{Local}
\data{\today}

\begin{document}
\pretextual

\imprimircapa

\imprimirfolhaderosto

\pdfbookmark{\contentsname}{toc}
\tableofcontents*
\clearpage

\textual

\chapter{Seção primária}

Segundo \textcite{fulano}...

\postextual

\printbibliography

\end{document}

E então no arquivo refs.bib:

@book{fulano,
  author={Fulano},
  title={Título},
  date={2018-07-23}
}

Melhoria

Para resolver isso, eu precisei fazer o seguinte: defini o comando \refname para usar ao invés do \bibname (ele é usado em outras classes também) e reimplementei o trecho do \renewcommand{\bibsection} com os comandos recomendados pela documentação do BibLaTeX (o conteúdo em si é o mesmo da definição original do abnTeX2).

\addto\captionsbrazil{
  \providecommand*{\refname}{Refer\^encias}
  ...
}
...
\AtBeginDocument{
  \@ifpackageloaded{biblatex}{
    \defbibheading{abnt}[\refname]{
      \chapter*{#1}
      \bibmark
      \ifmemoirbibintoc{ % front-end do BibLaTeX
        \phantomsection
        \addcontentsline{toc}{chapter}{\texorpdfstring{\MakeTextUppercase{#1}}{#1}}
      }{}
      \prebibhook
    }
  }{}
}

E então executando \printbibliography[heading=abnt] resulta no título correto. Porém, desta forma, um \renewcommand*{\refname}{<título>} funciona só depois que o Babel executar os comandos especificados dentro do \captions<língua> (após \begin{document}, por exemplo).

Note que executar \renewcommand{\bibname}{Refer\^encias} após o begin{document} funciona, mas então cada usuário tem que fazer isso (e de acordo com a língua do documento). E fazer isso automaticamente na classe não funciona:

\AtBeginDocument{
  \addto\captionsbrazil{
    \renewcommand*{\bibname}{Refer\^encias}
  }
}

Eu já acho essa solução uma baita gambiarra, mas sem \addto\captionsbrazil até tem efeito, só que daí não sei como filtrar pela língua selecionada e estraga a formatação da entrada no sumário.

dbmrq commented 6 years ago

Esse é, de fato, mais um problema da classe do que do estilo bibliográfico. De qualquer forma, acho que a ABNT sempre pede o título "Referências", então fiz essa mudança no próprio biblatex-abnt (https://github.com/abntex/biblatex-abnt/commit/95014f117ea457d1a03ae9161dc22fa4bb1a5608).

Por enquanto, essa versão só está disponível aqui no repositório. Enquanto ela não está disponível no ctan, você pode simplesmente fazer isto, em vez de definir um novo heading:

\printbibliography[title={Referências}]

Para resolver isso na classe, acho que o ideal é fazer algo assim:

\AtBeginDocument{
  \@ifpackageloaded{biblatex}{
    \defbibheading{bibliography}[\refname]{%
        \chapter*{#1}%
        \if@twoside
        \markboth{\abx@MakeMarkcase{#1}}{\abx@MakeMarkcase{#1}}%
        \else
        \markright{\abx@MakeMarkcase{#1}}%
        \fi
        \ifmemoirbibintoc
        {\phantomsection
        \addcontentsline{toc}{chapter}{#1}}
        {}}
  }{}
}

Eu não estou muito familiarizado com a classe abntex, então não vou fazer a mudança, mas acho que é uma boa, assim o título ficaria correto mesmo se a classe fosse utilizada com outro estilo.

ggabriel96 commented 6 years ago

Por "mais um problema da classe" você quer dizer do abnTeX2? Porque pelo que eu vi aqui, o problema continua usando o Memoir diretamente. E, sim, a ABNT requer sempre "Referências" mesmo.

Quanto à sua solução pra classe, se importaria de explicar o porquê do \if@twoside e \markboth e \markright? Eu também não manjo muito do abnTeX2... na verdade eu comecei agora a me aventurar com LaTeX "mais avançado" e escrita de pacotes e classes.

dbmrq commented 6 years ago

Sim, um problema da classe abntex2, e não do biblatex-abnt.

O BibLaTeX usa \refname pras classes do tipo "article" (article, scrartcl, memoir com a opção article) e \bibname pra classes do tipo "book" (book, scrbook, memoir vanilla).

Então o título é (com razão) definido de acordo com a classe, e não com o estilo bibliográfico.

Eu não uso e não conheço bem a classe abntex2, mas me parece que ela usa a classe memoir vanilla, que é feita para produzir livros, para imprimir coisas que não são livros. Então, na minha opinião, a classe abntex2 é que deveria dizer, "este documento não é estritamente um livro, e ele segue um formato específico, de modo que o título das referências deve ser X, e não Y".

Um usuário poderia, por exemplo, estar publicando um livro qualquer, sem seguir as normas da ABNT. Então ele usa a classe memoir pra diagramar o livro, usa formatos doidos pros títulos de capítulos e assim vai. Ele não está nem aí pras normas, só quer fazer um livro bonitinho. Só que ele precisa adicionar a bibliografia, então tem que escolher um estilo… e o livro vai ser publicado no Brasil, então por que não usar o biblatex-abnt? Nesse caso, ele pode querer apenas que a bibliografia siga o formato da ABNT. O título do capítulo da bibliografia, por outro lado, não precisa seguir as normas da ABNT, mas deve ter o mesmo formato doido que ele usou pros demais capítulos, e pode inclusive ter um título nada a ver. O título não deve ficar de acordo com o estilo bibliográfico, mas com o restante do documento (trabalho acadêmico, artigo etc.), e ele deve seguir, portanto, o que está especificado na classe, e não no estilo.

No entanto, eu imagino que a maior parte dos usuários do biblatex-abnt queira que o título também siga a norma. Por isso achei OK fazer a mudança no próprio estilo… então quando o biblatex-abnt for usado, o titulo será "Referências" independentemente da classe utilizada. Além disso, minha alteração só modifica o título padrão — ele ainda pode ser modificado explicitamente por classes específicas ou pelo próprio usuário (com \printbibliography[title={Bibliografia}], por exemplo). Então me pareceu ser uma mudança relativamente segura. Se no futuro houver alguma objeção eu posso pensar em voltar para o comportamento normal do BibLaTeX.

Quanto à minha solução, eu também não tenho a menor ideia do porquê dessas linhas, rs. Eu só olhei o código do próprio BibLaTeX e copiei o "heading" usado pro memoir, mudando apenas o título para \refname em vez de \bibname:

https://github.com/plk/biblatex/blob/a4d0e9efa2cf16b76b7aebe4c04bbb1e58913fe8/tex/latex/biblatex/biblatex.def#L1965-L1977

Mas, pesquisando agora rapidinho, me parece que o \markboth e o \markright têm a ver com o modo como o título do capítulo aparece no cabeçalho (quando aparece). Imagino que o \markboth faça o título aparecer no cabeçalho das duas páginas quando elas estão lado a lado, algo assim. 🤷🏻‍♂️

ggabriel96 commented 6 years ago

Ah sim, eu não creio que tenha a ver com o biblatex-abnt mesmo. E interessante isso dos usos do \refname e \bibname... concordo contigo! Aliás, separar o conteúdo da formatação é uma das vantagens do LaTeX, certo? Tudo bem, nesse caso o conteúdo do título é ditado pela norma, mas enfim... o que eu acho estranho é que não adianta executar um \renewcommand{\bibname}{Refer\^encias} antes de \begin{document} e eu não consegui descobrir o porquê. Se isso funcionasse, tava tudo certo. Eu só queria mudar o texto impresso, não mexer com o estilo. :(

Hmmm, entendi. Vou dar uma pesquisada a mais então sobre esses \mark... e então incorporo à minha solução.

Muito agradecido! :)

P.S.: devemos fechar a issue?

dbmrq commented 6 years ago

Redefinir o comando não adianta porque o próprio BibLaTeX redefine outra vez pra usar as bibstrings dos arquivos ltx.

Então se o que você quer é redefinir o texto do comando você precisa redefinir a bibstring, mais ou menos assim:

\DefineBibliographyStrings{brazilian}{%
  bibliography = {Referências},
}

Aí o BibLaTeX vai redefinir os comandos \bibname e \refname pra usar essas bibstrings:

https://github.com/plk/biblatex/blob/a4d0e9efa2cf16b76b7aebe4c04bbb1e58913fe8/tex/latex/biblatex/biblatex.sty#L5030-L5046

Mas você vai ter redefinido a string bibliography e ele vai usar o que você especificou.

Só que essas soluções não são muito boas por alguns motivos.

Em primeiro lugar, se você redefinisse o comando \bibname diretamente, você perderia a localização… então o título seria "Referências" mesmo se o arquivo estivesse em inglês.

Se em vez de redefinir o comando diretamente você redefinir a bibstring, como eu falei, tem em primeiro lugar um problema semântico… a string bibliography não deve ser Referências em português, ela deve ser Bibliografia mesmo. Só que o título não deve usar essa bibstring, e sim a references.

Além disso, você teria que mudar a bibstring bibliography pra todos os idiomas, sendo que existe uma bibstring adequada já traduzida (a references).

Então o que acontece é que o BibLaTeX é mais esperto… em vez de usar os comandos \bibname e \refname de modo ingênuo, ele os redefine de acordo com as bibstrings, permitindo títulos diferentes em idiomas diferentes. Então o que você precisa mudar não é os comandos, e sim as bibstrings.

Só que no seu caso o que você quer mudar não é nem as bibstrings… o que você quer é que o título use a bibstring references em vez da bibstring bibliography. E isso foi o que eu fiz na minha solução: redefini o heading bibliography, que é o padrão, pra usar \refname e, consequentemente, a bibstring references.

O código não precisa ser acrescentado necessariamente na classe, por sinal; você pode usar o código que eu mandei no seu preâmbulo.


Sobre esta issue, acho que o ideal é que isso seja resolvido na própria classe, então eu deixaria aberta. Mas fica a critério da equipe aqui da classe.

ggabriel96 commented 6 years ago

Entendi. De fato, definir \refname como eu fiz no primeiro post é desnecessário.

Novamente, agradeço muito pela atenção! :smiley:

dbmrq commented 6 years ago

Sem problemas. 🍻