From a45ed0eaa84144a5a34324d54aa326d5476ac5c2 Mon Sep 17 00:00:00 2001 From: Rudolf Adamkovic Date: Sat, 24 Aug 2024 15:26:18 +0200 Subject: [PATCH 3/3] ox-texinfo: Support numeric values of `toc' in `#+OPTIONS' * etc/ORG-NEWS (Texinfo exporter now supports numeric =toc= values in =#+OPTIONS:=): Announce the new feature. * lisp/ox.el (org-export-excluded-from-toc-p): Return nil for all headlines that are above the `toc' value in export `#+OPTIONS'. * testing/lisp/test-ox-texinfo.el (test-ox-texinfo/headings-and-table-of-contents): Add a test. --- etc/ORG-NEWS | 9 +++++ lisp/ox.el | 6 ++- testing/lisp/test-ox-texinfo.el | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 0ae1e4c81..3c0bfc173 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -85,6 +85,15 @@ You can now alter the Texinfo navigation hierarchy by specifying the information, see "13.14.6 Headings and sectioning structure" section of the Org manual. +*** Texinfo exporter now supports numeric =toc= values in =#+OPTIONS:= + +For example, given =H:3= and =toc:2= in =#+OPTIONS:=, all headings at +the 1st and 2nd level appear in the table of contents and those at the +3rd level do not. The latter will be instead exported as if they had +the =UNNUMBERED= property set to =notoc=, that is using the Texinfo +command given in the =unnumbered-no-toc-3= list position of the +=org-texinfo-classes= variable, as documented. + ** New and changed options # Chanes deadling with changing default values of customizations, diff --git a/lisp/ox.el b/lisp/ox.el index 7a0ab4dc7..acc535f72 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -5625,7 +5625,11 @@ contents. However, it is useful if some additional processing is required on headlines excluded from table of contents." (or (org-element-property :footnote-section-p headline) (org-export-low-level-p headline info) - (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)))) + (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)) + (let ((toc-depth (plist-get info :with-toc))) + (and (wholenump toc-depth) + (> (org-element-property :level headline) + toc-depth))))) (defun org-export-toc-entry-backend (parent &rest transcoders) "Return an export backend appropriate for table of contents entries. diff --git a/testing/lisp/test-ox-texinfo.el b/testing/lisp/test-ox-texinfo.el index 4a521b3ed..e6dfaf876 100644 --- a/testing/lisp/test-ox-texinfo.el +++ b/testing/lisp/test-ox-texinfo.el @@ -663,5 +663,71 @@ body (re-search-forward "^@node Heading 2 (Heading 1)$") (re-search-forward "^@chapter Heading 2 (@ref{Heading 1})$"))))))) + +;;; Headings and table of contents + +(ert-deftest test-ox-texinfo/headings-and-table-of-contents () + "Test headings with regards to table of contents." + (should + (org-test-with-temp-text + (string-join + (list "#+OPTIONS: h:2 toc:1 num:nil" + "* Level 1" + "** Level 1-1" + "*** Level 1-1-1" + "*** Level 1-1-2" + "** Level 1-2" + "*** Level 1-2-1" + "*** Level 1-2-2" + "* Level 2" + "** Level 2-1" + "*** Level 2-1-1" + "*** Level 2-1-2" + "** Level 2-2" + "*** Level 2-2-1" + "*** Level 2-2-2") + "\n") + (let ((export-buffer "*Test Texinfo Export*") + (org-export-show-temporary-export-buffer nil)) + (org-export-to-buffer 'texinfo export-buffer + nil nil nil nil nil + #'texinfo-mode) + (with-current-buffer export-buffer + (goto-char (point-min)) + (and + (re-search-forward "^@menu$") + (re-search-forward "^* Level 1::$") + (re-search-forward "^* Level 2::$") + (re-search-forward "^@detailmenu$") + (re-search-forward "^Level 1$") + (re-search-forward "^* Level 1-1::$") + (re-search-forward "^* Level 1-2::$") + (re-search-forward "^Level 2$") + (re-search-forward "^* Level 2-1::$") + (re-search-forward "^* Level 2-2::$") + (re-search-forward "^@node Level 1$") + (re-search-forward "^@unnumbered Level 1$") + (re-search-forward "^@menu$") + (re-search-forward "^* Level 1-1::$") + (re-search-forward "^* Level 1-2::$") + (re-search-forward "^@heading Level 1-1$") + (re-search-forward "^@anchor{Level 1-1-1}Level 1-1-1$") + (re-search-forward "^@anchor{Level 1-1-2}Level 1-1-2$") + (re-search-forward "^@heading Level 1-2$") + (re-search-forward "^@anchor{Level 1-2-1}Level 1-2-1$") + (re-search-forward "^@anchor{Level 1-2-2}Level 1-2-2$") + (re-search-forward "^@node Level 2$") + (re-search-forward "^@unnumbered Level 2$") + (re-search-forward "^@menu$") + (re-search-forward "^* Level 2-1::$") + (re-search-forward "^* Level 2-2::$") + (re-search-forward "^@heading Level 2-1$") + (re-search-forward "^@anchor{Level 2-1-1}Level 2-1-1$") + (re-search-forward "^@anchor{Level 2-1-2}Level 2-1-2$") + (re-search-forward "^@anchor{Level 2-2}$") + (re-search-forward "^@heading Level 2-2$") + (re-search-forward "^@anchor{Level 2-2-1}Level 2-2-1$") + (re-search-forward "^@anchor{Level 2-2-2}Level 2-2-2$"))))))) + (provide 'test-ox-texinfo) ;;; test-ox-texinfo.el end here -- 2.39.3 (Apple Git-146)