« ^ »

Emacsのorg-modeでorg-md-export-as-markdownの目次表記をカスタマイズする

所要時間: 約 11分

org-md-export-as-markdownはorg-modeのテキストをMarkdownに変換します。変換時に自動で挿入される目次の位置と表記をカスタマイズしました。

何をしたいのか・なぜしたいのか

https://sximada.qrunch.io/ でページの一覧を見ると本文の先頭50文字前後が表示されています。ここには記事の要約を表示したいのですが、org-md-export-as-markdownを使うとファイルの先頭には目次が自動で挿入されてしまいます。そのため今までは手動で目次の位置を変更していました。

今回はその目次の位置修正作業を省くため、先頭ではなく最初の見出しの直前に目次が挿入されるようにします。また目次の表記が Table of Contents となっていているので親しみが持てるよう おしながき に変更します。

org-md-export-as-markdownの挙動

org-md-export-as-markdownでの出力にはTable of Contents(目次)が追加されます。例えば次のようなOrgファイルがあるとします。

このOrgファイルは次のようなMarkdownに出力されます。


# Table of Contents

1.  [内容1](#org2b07bfa)
2.  [内容2](#org0ff52e8)
3.  [まとめ](#org3000cf8)

この記事の説明です。


<a id="org2b07bfa"></a>

# 内容1


<a id="org0ff52e8"></a>

# 内容2


<a id="org3000cf8"></a>

# まとめ

目次が先頭にあり、その後ろにOrgファイルの内容が挿入されています。しかし、今回は本当であれば以下のような出力に変更したいところです。


この記事の説明です。

# おしながき

1.  [内容1](#org2b07bfa)
2.  [内容2](#org0ff52e8)
3.  [まとめ](#org3000cf8)


<a id="org2b07bfa"></a>

# 内容1


<a id="org0ff52e8"></a>

# 内容2


<a id="org3000cf8"></a>

# まとめ

変更したい項目は2つです。

  1. Table of Contentsの表示位置を最初の項目(内容1)の直前に差し込む
  2. Table of Contentsの表示を おしながき に変更

Table of Contentsの表示位置を最初の見出しの前に差し込む

Table of Contentsを移動させるには2つの設定を行います。

デフォルトのTable of Contentsをオフにする

Orgファイルのヘッダーに #+OPTIONS: toc:nil を追加します。

#+OPTIONS: toc:nil

この設定でデフォルトのTable of Contentsは挿入されないようになります。

Table of Contentsを差し込みたいところに#+TOC: headlines Nを追加する

#+TOC: headlines N が書かれているところにはTable of Contentsが挿入されます。

#+TOC: headlines 2

今回は2階層までを指定して最初の見出しの後ろに設定します。

Table of Contentsの表示を おしながき に変更

Table of Contentsの表記は言語設定によって翻訳された状態で挿入されます。

言語を設定するには#+LANGUAGE:を指定します。日本語に設定するには ja を設定します。

#+LANGUAGE: ja

これを設定するとTable of Contentsは以下のように挿入されます。


# &#30446;&#27425;

1.  [テスト1](#orge970f69)
2.  [テスト2](#orge157e65)
3.  [テスト3](#orgfc3429a)

# &#30446;&#27425;# 目次 です。

これをおしながきに変更します。この翻訳にはorg-export-dictionaryの値が使われます。これは翻訳対象の文字列をcarにもつalistです。このalistの要素のcdrは、carが言語を指定する文字列(例えば"ja")です。 cdrは変換形式をkey、変換後の文字列をvalueにもつplistです。

org-export-dictionaryは上書きしてしまうと元に戻せなくなってしまうので、org-md-export-as-markdownを使うときだけ値を上書きする関数を定義します。

(defun our-org-md-export-as-markdown ()
  (interactive)
  (let ((org-export-dictionary
	 '(("%e %n: %c"
	    ("fr" :default "%e %n : %c" :html "%e&nbsp;%n&nbsp;: %c"))
	   ("Author"
	    ("ar" :default "تأليف")
	    ("ca" :default "Autor")
	    ("cs" :default "Autor")
	    ("da" :default "Forfatter")
	    ("de" :default "Autor")
	    ("eo" :html "A&#365;toro")
	    ("es" :default "Autor")
	    ("et" :default "Autor")
	    ("fi" :html "Tekij&auml;")
	    ("fr" :default "Auteur")
	    ("hu" :default "Szerz&otilde;")
	    ("is" :html "H&ouml;fundur")
	    ("it" :default "Autore")
	    ("ja" :default "著者" :html "&#33879;&#32773;")
	    ("nl" :default "Auteur")
	    ("no" :default "Forfatter")
	    ("nb" :default "Forfatter")
	    ("nn" :default "Forfattar")
	    ("pl" :default "Autor")
	    ("pt_BR" :default "Autor")
	    ("ru" :html "&#1040;&#1074;&#1090;&#1086;&#1088;" :utf-8 "Автор")
	    ("sl" :default "Avtor")
	    ("sv" :html "F&ouml;rfattare")
	    ("uk" :html "&#1040;&#1074;&#1090;&#1086;&#1088;" :utf-8 "Автор")
	    ("zh-CN" :html "&#20316;&#32773;" :utf-8 "作者")
	    ("zh-TW" :html "&#20316;&#32773;" :utf-8 "作者"))
	   ("Continued from previous page"
	    ("ar" :default "تتمة الصفحة السابقة")
	    ("cs" :default "Pokračování z předchozí strany")
	    ("de" :default "Fortsetzung von vorheriger Seite")
	    ("es" :html "Contin&uacute;a de la p&aacute;gina anterior" :ascii "Continua de la pagina anterior" :default "Continúa de la página anterior")
	    ("fr" :default "Suite de la page précédente")
	    ("it" :default "Continua da pagina precedente")
	    ("ja" :default "前ページからの続き")
	    ("nl" :default "Vervolg van vorige pagina")
	    ("pt" :default "Continuação da página anterior")
	    ("ru" :html "(&#1055;&#1088;&#1086;&#1076;&#1086;&#1083;&#1078;&#1077;&#1085;&#1080;&#1077;)"
	     :utf-8 "(Продолжение)")
	    ("sl" :default "Nadaljevanje s prejšnje strani"))
	   ("Continued on next page"
	    ("ar" :default "التتمة في الصفحة التالية")
	    ("cs" :default "Pokračuje na další stránce")
	    ("de" :default "Fortsetzung nächste Seite")
	    ("es" :html "Contin&uacute;a en la siguiente p&aacute;gina" :ascii "Continua en la siguiente pagina" :default "Continúa en la siguiente página")
	    ("fr" :default "Suite page suivante")
	    ("it" :default "Continua alla pagina successiva")
	    ("ja" :default "次ページに続く")
	    ("nl" :default "Vervolg op volgende pagina")
	    ("pt" :default "Continua na página seguinte")
	    ("ru" :html "(&#1055;&#1088;&#1086;&#1076;&#1086;&#1083;&#1078;&#1077;&#1085;&#1080;&#1077; &#1089;&#1083;&#1077;&#1076;&#1091;&#1077;&#1090;)"
	     :utf-8 "(Продолжение следует)")
	    ("sl" :default "Nadaljevanje na naslednji strani"))
	   ("Created"
	    ("cs" :default "Vytvořeno")
	    ("sl" :default "Ustvarjeno"))
	   ("Date"
	    ("ar" :default "بتاريخ")
	    ("ca" :default "Data")
	    ("cs" :default "Datum")
	    ("da" :default "Dato")
	    ("de" :default "Datum")
	    ("eo" :default "Dato")
	    ("es" :default "Fecha")
	    ("et" :html "Kuup&#228;ev" :utf-8 "Kuupäev")
	    ("fi" :html "P&auml;iv&auml;m&auml;&auml;r&auml;")
	    ("hu" :html "D&aacute;tum")
	    ("is" :default "Dagsetning")
	    ("it" :default "Data")
	    ("ja" :default "日付" :html "&#26085;&#20184;")
	    ("nl" :default "Datum")
	    ("no" :default "Dato")
	    ("nb" :default "Dato")
	    ("nn" :default "Dato")
	    ("pl" :default "Data")
	    ("pt_BR" :default "Data")
	    ("ru" :html "&#1044;&#1072;&#1090;&#1072;" :utf-8 "Дата")
	    ("sl" :default "Datum")
	    ("sv" :default "Datum")
	    ("uk" :html "&#1044;&#1072;&#1090;&#1072;" :utf-8 "Дата")
	    ("zh-CN" :html "&#26085;&#26399;" :utf-8 "日期")
	    ("zh-TW" :html "&#26085;&#26399;" :utf-8 "日期"))
	   ("Equation"
	    ("ar" :default "معادلة")
	    ("cs" :default "Rovnice")
	    ("da" :default "Ligning")
	    ("de" :default "Gleichung")
	    ("es" :ascii "Ecuacion" :html "Ecuaci&oacute;n" :default "Ecuación")
	    ("et" :html "V&#245;rrand" :utf-8 "Võrrand")
	    ("fr" :ascii "Equation" :default "Équation")
	    ("is" :default "Jafna")
	    ("ja" :default "方程式")
	    ("no" :default "Ligning")
	    ("nb" :default "Ligning")
	    ("nn" :default "Likning")
	    ("pt_BR" :html "Equa&ccedil;&atilde;o" :default "Equação" :ascii "Equacao")
	    ("ru" :html "&#1059;&#1088;&#1072;&#1074;&#1085;&#1077;&#1085;&#1080;&#1077;"
	     :utf-8 "Уравнение")
	    ("sl" :default "Enačba")
	    ("sv" :default "Ekvation")
	    ("zh-CN" :html "&#26041;&#31243;" :utf-8 "方程"))
	   ("Figure"
	    ("ar" :default "شكل")
	    ("cs" :default "Obrázek")
	    ("da" :default "Figur")
	    ("de" :default "Abbildung")
	    ("es" :default "Figura")
	    ("et" :default "Joonis")
	    ("is" :default "Mynd")
	    ("ja" :default "図" :html "&#22259;")
	    ("no" :default "Illustrasjon")
	    ("nb" :default "Illustrasjon")
	    ("nn" :default "Illustrasjon")
	    ("pt_BR" :default "Figura")
	    ("ru" :html "&#1056;&#1080;&#1089;&#1091;&#1085;&#1086;&#1082;" :utf-8 "Рисунок")
	    ("sv" :default "Illustration")
	    ("zh-CN" :html "&#22270;" :utf-8 "图"))
	   ("Figure %d:"
	    ("ar" :default "شكل %d:")
	    ("cs" :default "Obrázek %d:")
	    ("da" :default "Figur %d")
	    ("de" :default "Abbildung %d:")
	    ("es" :default "Figura %d:")
	    ("et" :default "Joonis %d:")
	    ("fr" :default "Figure %d :" :html "Figure&nbsp;%d&nbsp;:")
	    ("is" :default "Mynd %d")
	    ("ja" :default "図%d: " :html "&#22259;%d: ")
	    ("no" :default "Illustrasjon %d")
	    ("nb" :default "Illustrasjon %d")
	    ("nn" :default "Illustrasjon %d")
	    ("pt_BR" :default "Figura %d:")
	    ("ru" :html "&#1056;&#1080;&#1089;. %d.:" :utf-8 "Рис. %d.:")
	    ("sl" :default "Slika %d")
	    ("sv" :default "Illustration %d")
	    ("zh-CN" :html "&#22270;%d&nbsp;" :utf-8 "图%d "))
	   ("Footnotes"
	    ("ar" :default "الهوامش")
	    ("ca" :html "Peus de p&agrave;gina")
	    ("cs" :default "Poznámky pod čarou")
	    ("da" :default "Fodnoter")
	    ("de" :html "Fu&szlig;noten" :default "Fußnoten")
	    ("eo" :default "Piednotoj")
	    ("es" :ascii "Nota al pie de pagina" :html "Nota al pie de p&aacute;gina" :default "Nota al pie de página")
	    ("et" :html "Allm&#228;rkused" :utf-8 "Allmärkused")
	    ("fi" :default "Alaviitteet")
	    ("fr" :default "Notes de bas de page")
	    ("hu" :html "L&aacute;bjegyzet")
	    ("is" :html "Aftanm&aacute;lsgreinar")
	    ("it" :html "Note a pi&egrave; di pagina")
	    ("ja" :default "脚注" :html "&#33050;&#27880;")
	    ("nl" :default "Voetnoten")
	    ("no" :default "Fotnoter")
	    ("nb" :default "Fotnoter")
	    ("nn" :default "Fotnotar")
	    ("pl" :default "Przypis")
	    ("pt_BR" :html "Notas de Rodap&eacute;" :default "Notas de Rodapé" :ascii "Notas de Rodape")
	    ("ru" :html "&#1057;&#1085;&#1086;&#1089;&#1082;&#1080;" :utf-8 "Сноски")
	    ("sl" :default "Opombe")
	    ("sv" :default "Fotnoter")
	    ("uk" :html "&#1055;&#1088;&#1080;&#1084;&#1110;&#1090;&#1082;&#1080;"
	     :utf-8 "Примітки")
	    ("zh-CN" :html "&#33050;&#27880;" :utf-8 "脚注")
	    ("zh-TW" :html "&#33139;&#35387;" :utf-8 "腳註"))
	   ("List of Listings"
	    ("ar" :default "قائمة بالبرامج")
	    ("cs" :default "Seznam programů")
	    ("da" :default "Programmer")
	    ("de" :default "Programmauflistungsverzeichnis")
	    ("es" :ascii "Indice de Listados de programas" :html "&Iacute;ndice de Listados de programas" :default "Índice de Listados de programas")
	    ("et" :default "Loendite nimekiri")
	    ("fr" :default "Liste des programmes")
	    ("ja" :default "ソースコード目次")
	    ("no" :default "Dataprogrammer")
	    ("nb" :default "Dataprogrammer")
	    ("ru" :html "&#1057;&#1087;&#1080;&#1089;&#1086;&#1082; &#1088;&#1072;&#1089;&#1087;&#1077;&#1095;&#1072;&#1090;&#1086;&#1082;"
	     :utf-8 "Список распечаток")
	    ("sl" :default "Seznam programskih izpisov")
	    ("zh-CN" :html "&#20195;&#30721;&#30446;&#24405;" :utf-8 "代码目录"))
	   ("List of Tables"
	    ("ar" :default "قائمة بالجداول")
	    ("cs" :default "Seznam tabulek")
	    ("da" :default "Tabeller")
	    ("de" :default "Tabellenverzeichnis")
	    ("es" :ascii "Indice de tablas" :html "&Iacute;ndice de tablas" :default "Índice de tablas")
	    ("et" :default "Tabelite nimekiri")
	    ("fr" :default "Liste des tableaux")
	    ("is" :default "Töfluskrá" :html "T&ouml;fluskr&aacute;")
	    ("ja" :default "表目次")
	    ("no" :default "Tabeller")
	    ("nb" :default "Tabeller")
	    ("nn" :default "Tabeller")
	    ("pt_BR" :default "Índice de Tabelas" :ascii "Indice de Tabelas")
	    ("ru" :html "&#1057;&#1087;&#1080;&#1089;&#1086;&#1082; &#1090;&#1072;&#1073;&#1083;&#1080;&#1094;"
	     :utf-8 "Список таблиц")
	    ("sl" :default "Seznam tabel")
	    ("sv" :default "Tabeller")
	    ("zh-CN" :html "&#34920;&#26684;&#30446;&#24405;" :utf-8 "表格目录"))
	   ("Listing"
	    ("ar" :default "برنامج")
	    ("cs" :default "Program")
	    ("da" :default "Program")
	    ("de" :default "Programmlisting")
	    ("es" :default "Listado de programa")
	    ("et" :default "Loend")
	    ("fr" :default "Programme" :html "Programme")
	    ("ja" :default "ソースコード")
	    ("no" :default "Dataprogram")
	    ("nb" :default "Dataprogram")
	    ("pt_BR" :default "Listagem")
	    ("ru" :html "&#1056;&#1072;&#1089;&#1087;&#1077;&#1095;&#1072;&#1090;&#1082;&#1072;"
	     :utf-8 "Распечатка")
	    ("sl" :default "Izpis programa")
	    ("zh-CN" :html "&#20195;&#30721;" :utf-8 "代码"))
	   ("Listing %d:"
	    ("ar" :default "برنامج %d:")
	    ("cs" :default "Program %d:")
	    ("da" :default "Program %d")
	    ("de" :default "Programmlisting %d")
	    ("es" :default "Listado de programa %d")
	    ("et" :default "Loend %d")
	    ("fr" :default "Programme %d :" :html "Programme&nbsp;%d&nbsp;:")
	    ("ja" :default "ソースコード%d:")
	    ("no" :default "Dataprogram %d")
	    ("nb" :default "Dataprogram %d")
	    ("pt_BR" :default "Listagem %d")
	    ("ru" :html "&#1056;&#1072;&#1089;&#1087;&#1077;&#1095;&#1072;&#1090;&#1082;&#1072; %d.:"
	     :utf-8 "Распечатка %d.:")
	    ("sl" :default "Izpis programa %d")
	    ("zh-CN" :html "&#20195;&#30721;%d&nbsp;" :utf-8 "代码%d "))
	   ("References"
	    ("ar" :default "المراجع")
	    ("cs" :default "Reference")
	    ("fr" :ascii "References" :default "Références")
	    ("de" :default "Quellen")
	    ("es" :default "Referencias")
	    ("sl" :default "Reference"))
	   ("See figure %s"
	    ("cs" :default "Viz obrázek %s")
	    ("fr" :default "cf. figure %s"
	     :html "cf.&nbsp;figure&nbsp;%s" :latex "cf.~figure~%s")
	    ("sl" :default "Glej sliko %s"))
	   ("See listing %s"
	    ("cs" :default "Viz program %s")
	    ("fr" :default "cf. programme %s"
	     :html "cf.&nbsp;programme&nbsp;%s" :latex "cf.~programme~%s")
	    ("sl" :default "Glej izpis programa %s"))
	   ("See section %s"
	    ("ar" :default "انظر قسم %s")
	    ("cs" :default "Viz sekce %s")
	    ("da" :default "jævnfør afsnit %s")
	    ("de" :default "siehe Abschnitt %s")
	    ("es" :ascii "Vea seccion %s" :html "Vea secci&oacute;n %s" :default "Vea sección %s")
	    ("et" :html "Vaata peat&#252;kki %s" :utf-8 "Vaata peatükki %s")
	    ("fr" :default "cf. section %s")
	    ("ja" :default "セクション %s を参照")
	    ("pt_BR" :html "Veja a se&ccedil;&atilde;o %s" :default "Veja a seção %s"
	     :ascii "Veja a secao %s")
	    ("ru" :html "&#1057;&#1084;. &#1088;&#1072;&#1079;&#1076;&#1077;&#1083; %s"
	     :utf-8 "См. раздел %s")
	    ("sl" :default "Glej poglavje %d")
	    ("zh-CN" :html "&#21442;&#35265;&#31532;%s&#33410;" :utf-8 "参见第%s节"))
	   ("See table %s"
	    ("cs" :default "Viz tabulka %s")
	    ("fr" :default "cf. tableau %s"
	     :html "cf.&nbsp;tableau&nbsp;%s" :latex "cf.~tableau~%s")
	    ("sl" :default "Glej tabelo %s"))
	   ("Table"
	    ("ar" :default "جدول")
	    ("cs" :default "Tabulka")
	    ("de" :default "Tabelle")
	    ("es" :default "Tabla")
	    ("et" :default "Tabel")
	    ("fr" :default "Tableau")
	    ("is" :default "Tafla")
	    ("ja" :default "表" :html "&#34920;")
	    ("pt_BR" :default "Tabela")
	    ("ru" :html "&#1058;&#1072;&#1073;&#1083;&#1080;&#1094;&#1072;"
	     :utf-8 "Таблица")
	    ("zh-CN" :html "&#34920;" :utf-8 "表"))
	   ("Table %d:"
	    ("ar" :default "جدول %d:")
	    ("cs" :default "Tabulka %d:")
	    ("da" :default "Tabel %d")
	    ("de" :default "Tabelle %d")
	    ("es" :default "Tabla %d")
	    ("et" :default "Tabel %d")
	    ("fr" :default "Tableau %d :")
	    ("is" :default "Tafla %d")
	    ("ja" :default "表%d:" :html "&#34920;%d:")
	    ("no" :default "Tabell %d")
	    ("nb" :default "Tabell %d")
	    ("nn" :default "Tabell %d")
	    ("pt_BR" :default "Tabela %d")
	    ("ru" :html "&#1058;&#1072;&#1073;&#1083;&#1080;&#1094;&#1072; %d.:"
	     :utf-8 "Таблица %d.:")
	    ("sl" :default "Tabela %d")
	    ("sv" :default "Tabell %d")
	    ("zh-CN" :html "&#34920;%d&nbsp;" :utf-8 "表%d "))
	   ("Table of Contents"
	    ("ar" :default "قائمة المحتويات")
	    ("ca" :html "&Iacute;ndex")
	    ("cs" :default "Obsah")
	    ("da" :default "Indhold")
	    ("de" :default "Inhaltsverzeichnis")
	    ("eo" :default "Enhavo")
	    ("es" :ascii "Indice" :html "&Iacute;ndice" :default "Índice")
	    ("et" :default "Sisukord")
	    ("fi" :html "Sis&auml;llysluettelo")
	    ("fr" :ascii "Sommaire" :default "Table des matières")
	    ("hu" :html "Tartalomjegyz&eacute;k")
	    ("is" :default "Efnisyfirlit")
	    ("it" :default "Indice")
	    ("ja" :default "目次" :html "おしながき")
	    ("nl" :default "Inhoudsopgave")
	    ("no" :default "Innhold")
	    ("nb" :default "Innhold")
	    ("nn" :default "Innhald")
	    ("pl" :html "Spis tre&#x015b;ci")
	    ("pt_BR" :html "&Iacute;ndice" :utf8 "Índice" :ascii "Indice")
	    ("ru" :html "&#1057;&#1086;&#1076;&#1077;&#1088;&#1078;&#1072;&#1085;&#1080;&#1077;"
	     :utf-8 "Содержание")
	    ("sl" :default "Kazalo")
	    ("sv" :html "Inneh&aring;ll")
	    ("uk" :html "&#1047;&#1084;&#1110;&#1089;&#1090;" :utf-8 "Зміст")
	    ("zh-CN" :html "&#30446;&#24405;" :utf-8 "目录")
	    ("zh-TW" :html "&#30446;&#37636;" :utf-8 "目錄"))
	   ("Unknown reference"
	    ("ar" :default "مرجع غير معرّف")
	    ("da" :default "ukendt reference")
	    ("de" :default "Unbekannter Verweis")
	    ("es" :default "Referencia desconocida")
	    ("et" :default "Tundmatu viide")
	    ("fr" :ascii "Destination inconnue" :default "Référence inconnue")
	    ("ja" :default "不明な参照先")
	    ("pt_BR" :default "Referência desconhecida"
	     :ascii "Referencia desconhecida")
	    ("ru" :html "&#1053;&#1077;&#1080;&#1079;&#1074;&#1077;&#1089;&#1090;&#1085;&#1072;&#1103; &#1089;&#1089;&#1099;&#1083;&#1082;&#1072;"
	     :utf-8 "Неизвестная ссылка")
	    ("sl" :default "Neznana referenca")
	    ("zh-CN" :html "&#26410;&#30693;&#24341;&#29992;" :utf-8 "未知引用")))))
    (org-md-export-as-markdown)))

このour-org-md-export-as-markdownをM-xで呼び出すと次のようなMarkdownに変換されます。


# おしながき

1.  [内容1](#org18246ea)
2.  [内容2](#orgb07ec63)
3.  [まとめ](#org587c63e)

この記事の説明です。


<a id="org18246ea"></a>

# 内容1


<a id="orgb07ec63"></a>

# 内容2


<a id="org587c63e"></a>

# まとめ

目次のタイトルが おしながき になっています。

2つの設定を合わせる

先ほどの設定を適応すると次のようなOrgファイルができます。

このファイルのバッファ上でour-org-md-export-as-markdownを実行すると次のMarkdownに変換されます。

この記事の説明です。


# おしながき

1.  [内容1](#org46b4f5f)
2.  [内容2](#org1df6c80)
3.  [まとめ](#org97ed709)


<a id="org46b4f5f"></a>

# 内容1


<a id="org1df6c80"></a>

# 内容2


<a id="org97ed709"></a>

# まとめ

目次のタイトルが おしながき になって最初のheadlineの直前に挿入されました。

まとめ

org-modeのOPTIONSヘッダーとTOCヘッダーを使うことで目次の位置を変更しました。またorg-export-dictionaryを一時的に上書きすることで目次の文言を おしながき に変更しました。