5
votes

Comment utiliser les numéros de section LaTeX dans les références croisées Pandoc

La documentation Pandoc indique que des références croisées peuvent être faites aux en-têtes de section de plusieurs manières. Par exemple, vous pouvez créer votre propre identifiant et référencer cet identifiant. Par exemple:

[Link to header](#header)

créera un identifiant avec la valeur '#header' qui peut être référencé dans le texte, comme tel:

# This is my header {#header}

Ce qui affichera le texte «Lien vers l'en-tête» avec un lien vers l'en-tête.

Je n'ai trouvé nulle part comment faire du texte du lien le numéro de section une fois compilé en tant que document LaTeX.

Par exemple, si mon en-tête est compilé en «1.2.3 Section Header», je souhaite que ma référence croisée au texte s'affiche sous la forme «1.2.3».


0 commentaires

4 Réponses :


2
votes

Ceci peut être réalisé en définissant l'ID comme précédemment. par exemple:

\ref{header}

Ensuite, dans le texte, la référence croisée peut être écrite comme suit:

# This is my header {#header}

Lorsque cela se compile en LaTeX, la croix- le texte de référence sera le numéro de section de l'en-tête référencé.


0 commentaires

3
votes

2 commentaires

Enfin, j'ai assez de karma pour vous voter. Merci pour ce joli filtre! Pour référence future, il devrait être inclus dans le référentiel lua-filters de pandoc. À votre santé!


Merci @ A.M.! Tellement génial d'entendre que cela est utile :)



3
votes

Vous pouvez utiliser le filtre pandoc-secnos , qui fait partie du pandoc-xnos suite de filtres.

L'en-tête

# This is my header

est référencé en utilisant @sec: header . Alternativement, vous pouvez référencer

# This is my header {#sec:header}

en utilisant @sec:this-is-my-header.

Documents Markdown codés en cette manière peut être traitée en ajoutant --filter pandoc-secnos à l'appel pandoc . L'option --number-sections doit également être utilisée. La sortie utilise les commandes natives de LaTeX (c'est-à-dire \ label et \ ref ou \cref).

L'avantage de cette approche est que la sortie dans d'autres formats (html, epub, docx, ...) est également possible.


0 commentaires

3
votes

Depuis pandoc version 2.8, la fonction pandoc.utils.hierarchicalize a été remplacée par make_sections . Voici une version mise à jour de la réponse de @ tarleb qui fonctionne avec les nouvelles versions «pandoc».

local make_sections = (require 'pandoc.utils').make_sections
local section_numbers = {}

function populate_section_numbers (doc)
  function populate (elements)
    for _, el in pairs(elements) do
      if el.t == 'Div' and el.attributes.number then
        section_numbers['#' .. el.attr.identifier] = el.attributes.number
        populate(el.content)
      end
    end
  end

  populate(make_sections(true, nil, doc.blocks))
end

function resolve_section_ref (link)
  if #link.content > 0 or link.target:sub(1, 1) ~= '#' then
    return nil
  end
  local section_number = pandoc.Str(section_numbers[link.target])
  return pandoc.Link({section_number}, link.target, link.title, link.attr)
end

return {
  {Pandoc = populate_section_numbers},
  {Link = resolve_section_ref}
}


0 commentaires