はじめに
Obsidian で文字を入力する際に上付きもしくは下付きの文字を入力する必要が生じたのでやり方を調べてみた。上付きの文字は x2、下付きの文字は x2みたいな文字のこと。
書き方
HTML のタグを使う。具体的には
x<sup>2</sup>
と書いたら上付きの文字になるし、
x<sub>2</sub>
と書いたら下付きの文字になる。簡単。
ただ、めんどくさい
コミュニティプラグインを検索
SupSub というプラグインを発見。
ホットキーで切り替えができるようだ。これは Templater で十分可能な内容だ。
Templater に流用
main.ts からコードを拝借した。選択範囲を正規表現で抽出して置換するだけのよう。
function wrapSelection(tag, editor) {
const selection = editor.getSelection();
const regex = new RegExp(`<${tag}>(.*?)<\/${tag}>`);
const matches = regex.exec(selection);
if (matches) {
const debracketedSelection = matches[1];
editor.replaceSelection(debracketedSelection);
} else {
const wrappedSelection = `<${tag}>${selection}</${tag}>`;
editor.replaceSelection(wrappedSelection);
}
}
editor = app.workspace.activeLeaf.view.editor;
wrapSelection('sup', editor);
これは上付きの場合のコード。下付きの場合は sup→sub に変更する。
ホットキーに登録する
Claude3.5 に聞いてみたところ、一般的なエディターの場合は
- 上付き文字:
- Ctrl + Shift + +(プラス記号)
- Command + Shift + +(Mac)
- 下付き文字:
- Ctrl + =(イコール記号)
- Command + =(Mac)
らしいのでこのボタンを登録しておく。
Pandoc でワードに出力可能にする
私は Pandoc をよく使用するので、ワード出力も可能にしたいが HTML のタグは読み取ってくれない。ただ、Pandoc には Pandoc で上付きや下付きの記法があるようなので、HTML タグを Pandoc の形式に変換すすれば良い。Pandoc の Documents には、
H~2~O is a liquid. 2^10^ is 1024.
と書いてあるので、subscript は~で、superscript は^で囲えば良いようだ。ググると Lua Filter で解決する記事を発見した。
Markdown中の下付き文字をPandocでWord/LaTeX出力する際にLuaフィルターで処理してみる Markdown - Qiita
Lua Filter は.lua で終わるコードが書かれたテキストファイルを作成して、Pandoc の実行コマンドに
--lua-filter=ファイルパス.lua
と追記すれば良い。Obsidian の Pandoc プラグインに適応する場合は設定の Extra Pandoc arguments の欄に書いておけば実行の度に適応される。
上付き文字の Lua filter
function Inlines(inlines)
local start = 1
while start < #inlines do
if (inlines[start].text == '<sup>') then
local len = 1
while (start + len <= #inlines) do
if (inlines[start + len].text == '</sup>') then
local inner = {
table.unpack(inlines, start + 1, start + len)
}
for j = 1, len do inlines:remove(start) end
inlines:insert(start, pandoc.Superscript(inner))
break
end
len = len + 1
end
end
start = start + 1
end
return inlines
end
下付き文字の Lua filter
function Inlines(inlines)
local start = 1
while start < #inlines do
if (inlines[start].text == '<sub>') then
local len = 1
while (start + len <= #inlines) do
if (inlines[start + len].text == '</sub>') then
local inner = {
table.unpack(inlines, start + 1, start + len)
}
for j = 1, len do inlines:remove(start) end
inlines:insert(start, pandoc.Subscript(inner))
break
end
len = len + 1
end
end
start = start + 1
end
return inlines
end
おわりに
上付き文字、下付き文字が Obsidian 内で便利に使用でき、かつ出力できるようになった。Lua filter に関してもそのうち書きたい。