Rmarkdown: возможно ли отображать оглавление текущей вкладки только в наборе вкладок

Название говорит само за себя...

Если у меня есть документ R-markdown, структурированный следующим образом

# TITLE { .tabset }

## First tab : mammals

### rabbits

### dogs

### elephants

## Second tab : birds

### sparrows

### swallows

Я хотел бы, чтобы TOC отображал только элементы «кролики, собаки, слоны», когда активна первая вкладка, и только «воробьи, ласточки», когда активна вторая вкладка.

Спасибо заранее


person Elvis    schedule 21.02.2019    source источник
comment
Не могли бы вы дополнить пример полным кодом файла Rmd, пожалуйста?   -  person RLesur    schedule 21.02.2019


Ответы (1)


Это может быть не самое простое решение, но оно должно работать, даже если у вас есть разделы с одинаковыми именами на разных панелях вкладок. Он адаптирован к вашему MRE, поэтому, возможно, потребуется внести коррективы в зависимости от вашего реального приложения.

Я использовал Javascript для достижения того, чего вы хотите. Просто добавьте код в начало документа rmarkdown.

Я надеюсь, что комментарии прояснят, что происходит.

<script type="text/javascript">
$(document).ready(function() {
  var $tocItems = $(".tocify-subheader li.tocify-item"); // selector for all TOC items
  var $tabs     = $("a[role=\"tab\"]");                  // selector for all tabs
  var $panels   = $("div[role=\"tabpanel\"]");           // selector for all tabpanels

  $tocItems.hide();  // hide all TOC items

  // get the tab name for each section header (e.g. mammals)
  // and assign it to its corresponding toc item
  $panels.find("div[data-unique]").each(function() {
    var key = $(this).attr("data-unique");
    var tab = $(this).closest("div[role=\"tabpanel\"]").attr("id");
    $tocItems.filter("[data-unique=\"" + key + "\"]").attr("tab", tab)
  })
  // now each toc item knows to which tab panel it is pointing

  // show the toc items that point to sections on the first panel
  $tocItems.filter(function() {
    return($(this).attr("tab") === $tabs.first().text());
  }).toggle();

  // assign an onclick event to the tabs..
  $tabs.on("click", function() {
    $tocItems.hide();  // ... hide all TOC items
    var key = $(this).text(); // ... get the name of the tab clicked
    $tocItems.filter(function() {  // ... filter for the toc items pointing to that tab
      return($(this).attr("tab") === key);
    }).toggle();  // ... and show them
  });  
});
</script>
person Martin Schmelzer    schedule 21.02.2019
comment
Вау, спасибо — почему-то я не получил уведомление о вашем ответе и вижу его только сейчас. Я попробую это! (даже если тем временем я остановился на другом решении...) - person Elvis; 02.03.2019