Cosenseで長い段落を「解体」する
#UserScript
本や論文では、同じ段落の文章は連続して書き、段落の切れ目で改行+段落始めで字下げ、というスタイルがスタンダードとなっている。
これは、紙に文章を印刷する場合は、無駄な空白部分を減らしつつ意味の切れ目を視覚的に確保する手段として有効だったと思う。
が、そのような制約がない場合に視認性に特化するのであれば、この方法は最適でないと昔から思っていた。
↑の文章と↓の文章のどちらが視覚的に読みやすいと思うだろうか。
本や論文では、同じ段落の文章は連続して書き、段落の切れ目で改行+段落始めで字下げ、というスタイルがスタンダードとなっている。これは、紙に文章を印刷する場合は、無駄な空白部分を減らしつつ意味の切れ目を視覚的に確保する手段として有効だったと思う。が、そのような制約がない場合に視認性に特化するのであれば、この方法は最適でないと昔から思っていた。
文章をするすると読める人であれば、後者の方が視点の移動が少なくスムースに読めるのかもしれない。
スマホだとあまり変わらないかも。
しかし、自分のように集中力が持続しづらく、長い文章を読むのが苦痛である人間にとっては、前者の書き方の方が明らかに読みやすいのではないかと思う。
具体的なメリットとしては:
改行の頻度、すなわち視点のジャンプの頻度そのものは増えるが、同一センテンス内での、前後が意味的に連続している改行の頻度は大きく減る。
自分を含め、文章を読むことに苦手意識のある(かつ文字認識そのものに大きな問題があるわけではない)という人の多くが、改行による視点移動(ジャンプ)を苦手としているのではないかと思う。
センテンス単位での読み飛ばしが楽。
段落の途中で意識が脱落しても、各センテンスの頭が一目瞭然なので途中復帰しやすい。
段落内でのロジックの構造を追いやすい。
「しかし」などの接続詞が行頭に来やすいのも効いている。
これは、自分に多少プログラミングの経験があることとも無関係ではないかもしれない。
基本的にプログラミング言語では、一行に書かれるコマンドは一つである。
言語によってはセミコロンなどで区切れば一行にいくらでも詰め込めるものもあるが、それは原則として望ましくないとされる。
それはコンピュータ側の処理の都合ではなく、読む人間側の都合である。
そういうわけで最近は、自炊+OCRした本や論文の中身を自分のプライベートのCosense上にコピペして、以下のUserScriptで「解体」して読むことが増えた。
実際にコードを書いたのはもちろんClaude。
こうしても読みやすくならない文章は、そもそも原文が長ったらしい文からなる悪文なのではないかと思ったりする。
原文の段落の区切りは、改行を2回して空白の行を挟むことで代替しており、原文の情報が失われることはない。
こういう書き方は実際ブログやケータイ小説などで普通にやられてきた。
各行ごとにその下にインデントを下げてメモやコメントなどを打てるのもよい。
Kindeなどの電子書籍リーダーにこういう補助機能があってもいいと思うのだけれども。
たとえば、田口茂「閉じた個という不合理──フッサールと西田における他性の謎」(pdf)の冒頭:
われわれは、意識の「境界」を見ることができるだろうか。本提題では、この問いに正面から取り組むことを試みたい。われわれはしばしば、意識が境界によって区切られた一つのカプセルであるかのように考えている。本提題では、そのような見方がわれわれに与えられた現実に即していないということを、現象学的な仕方で示していくことにしたい。だが、意識が閉じていないとすると、とりわけ解釈が難しくなってくるのは、「他者」をどう考えたらよいのか、という点である。意識が完全に開いていれば、他者はいなくなってしまう。かといって閉じた意識の見方に逆戻りすれば、それに伴う様々な不合理をも引き受けることになってしまう。
本提題では、この根本問題に、フッサールと西田がどのように取り組んだのかを見ていきたい。もっとも、わずかな紙数で汲み尽くすことができるテーマではない。ここで可能なのは、フッサールと西田の取り組みから、この問題を考える上での若干のヒントを受けとることにとどまる。E・レヴィナスについても若干言及したい。
以下では、まず第一に「意識には境界がない」という点を確認し、それを「非文脈性」として解釈した上で、そこに「他者」が現われるとはいかなる事態かという仕方で問題設定を行う。次いで第二に、この問いにフッサールがどのように取り組んだかを見ていく。前期フッサールは、「無規定的なもの」としての純粋意識を基盤としてこの問いに対処しようとしたが、その挫折は後年の「原自我」の問いへとつながってゆく。さらに第三に、同じ問題を西田幾多郎がどのように扱ったかを検討する。前期西田の純粋経験論における試みは、後年の論文「私と汝」によって乗り越えられているように見える。この二つの試みを対比しつつ論じてみたい。
が↓こうなる。
われわれは、意識の「境界」を見ることができるだろうか。
本提題では、この問いに正面から取り組むことを試みたい。
われわれはしばしば、意識が境界によって区切られた一つのカプセルであるかのように考えている。
本提題では、そのような見方がわれわれに与えられた現実に即していないということを、現象学的な仕方で示していくことにしたい。
だが、意識が閉じていないとすると、とりわけ解釈が難しくなってくるのは、「他者」をどう考えたらよいのか、という点である。
意識が完全に開いていれば、他者はいなくなってしまう。
かといって閉じた意識の見方に逆戻りすれば、それに伴う様々な不合理をも引き受けることになってしまう。
本提題では、この根本問題に、フッサールと西田がどのように取り組んだのかを見ていきたい。
もっとも、わずかな紙数で汲み尽くすことができるテーマではない。
ここで可能なのは、フッサールと西田の取り組みから、この問題を考える上での若干のヒントを受けとることにとどまる。
E・レヴィナスについても若干言及したい。
以下では、まず第一に「意識には境界がない」という点を確認し、それを「非文脈性」として解釈した上で、そこに「他者」が現われるとはいかなる事態かという仕方で問題設定を行う。
次いで第二に、この問いにフッサールがどのように取り組んだかを見ていく。
前期フッサールは、「無規定的なもの」としての純粋意識を基盤としてこの問いに対処しようとしたが、その挫折は後年の「原自我」の問いへとつながってゆく。
さらに第三に、同じ問題を西田幾多郎がどのように扱ったかを検討する。
前期西田の純粋経験論における試みは、後年の論文「私と汝」によって乗り越えられているように見える。
この二つの試みを対比しつつ論じてみたい。
まぁ、どちらが優れているとかいうことではなく、あくまで趣味の問題である。
code:split paragraph.js
scrapbox.PopupMenu.addButton({
title: 'split sentences',
onClick: text => {
// 選択テキスト末尾の改行・スペース・タブを取り除く
const trimmedText = text.replace(/\n \t +$/, '');
return trimmedText.split('\n').map(line => {
// 行頭のインデント(スペース・タブ)を検出
const indentMatch = line.match(/^( \t*)/);
const indent = indentMatch ? indentMatch1 : '';
const afterIndent = line.slice(indent.length);
// インデントの後ろにある引用記号を検出
const quoteMatch = afterIndent.match(/^(>+\s?)/);
const prefix = quoteMatch ? quoteMatch1 : '';
const body = quoteMatch ? afterIndent.slice(prefix.length) : afterIndent;
// 区切り文字判定
const isSentenceEnd = ch => ch === '。' || ch === '!' || ch === '?';
// 現在開いているブラケットのマーカー(開いていない時は null)
let openMarker = null;
let result = '';
let i = 0;
while (i < body.length) {
const ch = bodyi;
if (ch === '[' && openMarker === null) {
result += ch;
// 「[」の直後にある装飾マーカー(* / - _ の連続 + スペース1つ)を読み取る
const markerMatch = body.slice(i + 1).match(/^(*\-_/+)\s/);
if (markerMatch) {
openMarker = markerMatch1 + ' ';
result += openMarker;
i += 1 + openMarker.length;
} else {
openMarker = ''; // 装飾マーカーなしのブラケット(リンク等)
i++;
}
} else if (ch === ']' && openMarker !== null) {
result += ch;
openMarker = null;
// 閉じカッコの直前が区切り文字なら改行
if (i > 0 && isSentenceEnd(bodyi - 1) && i !== body.length - 1) {
result += '\n';
let j = i + 1;
while (j < body.length && (bodyj === ' ' || bodyj === ' ')) j++;
i = j;
continue;
}
i++;
} else if (isSentenceEnd(ch)) {
// 連続する区切り文字(!?など)をまとめて出力
let end = i;
while (end < body.length && isSentenceEnd(bodyend)) end++;
result += body.slice(i, end);
if (openMarker === null) {
// ブラケット外: 通常の区切り処理
if (end < body.length && bodyend !== ']') {
result += '\n';
while (end < body.length && (bodyend === ' ' || bodyend === ' ')) end++;
}
i = end;
} else {
// ブラケット内: 装飾マーカーありの場合のみ、ブラケットを閉じて開き直す
if (end < body.length && bodyend === ']') {
// 次が ] なら閉じてもらう
i = end;
} else if (end >= body.length) {
i = end;
} else if (openMarker !== '') {
// 装飾マーカーありの場合: 一旦閉じて改行、同じマーカーで開き直す
result += ']\n[' + openMarker;
while (end < body.length && (bodyend === ' ' || bodyend === ' ')) end++;
i = end;
} else {
// 装飾マーカーなし(リンクなど)の場合は何もしない
i = end;
}
}
} else {
result += ch;
i++;
}
}
// 分割後の各行頭に indent + prefix を付ける
const lines = result.split('\n');
return lines.map(l => indent + prefix + l).join('\n');
}).join('\n');
}
});