textlint-ja / textlint-rule-ja-no-mixed-period

文末の句点(。)の統一 と 抜けをチェックするtextlintルール
MIT License
9 stars 3 forks source link

allow not to use period before texequation block #8

Open Nyoho opened 1 year ago

Nyoho commented 1 year ago

Re:VIEW で //texequation のブロックを使っているときに、その前の文は下と繋がっているように解釈して、そこに「。」で終わっていないことを許容して欲しいと考えています。

このような例です。

@<m>$x$ の関数 @<m>{y} の導関数 @<m>$\frac{dy}{dx}$ は
//texequation{
\frac{dy}{dx} = \lim_{h\to 0} \frac{f(x+h) - f(x)}{h}
//}
です。

1 の箇条書きの前の書き方と似ているので、 periodMark に「、」を入れて許容することも考えたのですが、

(1行目を「は、」とする) 数学ではそれ以外の書き方もあり、例えば

@<m>$x$ の関数 @<m>{y} の導関数
//texequation{
\frac{dy}{dx} = \lim_{h\to 0} \frac{f(x+h) - f(x)}{h}
//}
を考える。

では、1行目の最後に「、」を入れるのは変なので、texequationとその下も含めて1文と解釈して欲しいです。

これは .textlintrc のオプションを工夫することで可能でしょうか。

azu commented 1 year ago

CodeBlockを挟む場合も同じですが、実際に文が句読点で終わってないので扱いが難しそうな気もします。 自分の場合は、説明の文がコードブロックなどをまたいでしまうと読みにくいので、大体次のように書いてる気はします。

@<m>$x$ の関数 @<m>{y} の導関数は、次のようなものを考える。
//texequation{
\frac{dy}{dx} = \lim_{h\to 0} \frac{f(x+h) - f(x)}{h}
//}

これは、書籍などのページの概念がある表示では、間にブロックが入ると次のページに。が入ってしまうなど読みにくさが出るためです(文を短く切るというイメージの延長です)。

今のところ、これに対応できるオプション自体はまだないですね。 コメントでignoreするぐらいですかね。 https://textlint.github.io/docs/ignore.html

末尾が。で終わってない文の次のNodeが xxx なら無視みたいなオプションがあると解決はできそうな気がしますが、 ある程度汎用的なオプションを考えたいですね。

Re:VIEWのパース内容はちょっとまだ見てないですが、構造的には次のようなパターンを扱いたいという話になる気はします。

<Paragraph node - 。で終わらない>

<CodeBlock node>

<Paragraph node - 前のParagraphの続きで。で終わる。>
Nyoho commented 1 year ago

ありがとうございます!

数学では、TeXの数式はdisplayするかしないかの違いでしかない、文の一部として普通に使われています。 人それぞれかも知れませんが、僕は(というか数学では)displayすることで読みにくいことはないと思います。 (おっしゃるような、display数式を日本語の文とは別になるように書き換えることは数学ではしないですね。長めだったり重要だったりする数式だからdisplayするだけですので)

最後に考えていただいたオプションが実現されると、数学的な文章を書くときには大変助かります。

本当はパラグラフを切らないでパースしてくれると嬉しいのですが、Re:VIEWのリポジトリのdiscussionで質問したところによると、Re:VIEWの構造上難しいそうです。

そういう汎用オプションを実装するとしたら、それはこのリポジトリでしょうか。それとも textlint-plugin-review 側で実装するものでしょうか。

azu commented 1 year ago

数式はblock要素ではなく、inline要素になるんですかね。 inline要素なら、構造的には次のようにパラグラフの中に入ってるのが一番良いですが、パース的にかなり面倒な感じになりそうな予感がします。

<Paragraph node>
  <Math />
</Pargraph>

textlint-plugin-review側でやるのはちょっと大変なのかもですね。

https://github.com/textlint-ja/textlint-rule-ja-no-mixed-period/issues/8#issuecomment-1354039701 で書いてたようにCodeBlockを挟むパターンはMarkdownなどでもあり得るので、 ルール側でやるのもありだとは思います(あんまり綺麗にできるイメージは自分はまだ持ってないですが、デフォルトオフならある程度ラフな実装もあり得そう)。

この構造がかなり特殊(Re:VIEWしか起きないとか)ならそのパターンだけを無視するフィルタールールを書くという別の方法もあります。 特定のパターンを無視するための、別のルールを書くという感じですね。textlint-disableコメントもこのフィルタールールとして実装されています。けど、これはワークアラウンド的な感じですね。

📝 https://github.com/textlint/textlint-filter-rule-allowlist/{。以外}\n\/\/texequation\{.*\}/ なら 無視するみたいなパターンを書くのはできるけど、特定のルールだけ無視するオプションが実装されてなかったのか

Nyoho commented 1 year ago

あ、「数式はblock要素ではなく、inline要素になるのか」についてはTeXが内部的にどうやっているのか僕はよく理解していませんでした。block要素のように「別行立て」にはなるが、パラグラフは続く(ので、次の地の文の頭は下がらない)という状況です。

TeXの例

image

これはTeXの文章の一部です。冒頭は段落の頭なので字下げされていますが、[ ]のあとの「が全単射になる」の部分は、段落の頭ではなく、途中なので、字下げされずに続いています。

「ルール側でやるのもあり」かつ「デフォルトオフならある程度ラフな実装もあり得そう」という見通しがあるとのこと、とても心強いです!

一旦、特別に無視するフィルタールールという方向で、自分で作れないか考えてみます。ありがとうございます。