FC2ブログ
  1. 無料アクセス解析

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【日記】淫語によく出る「゛」を横書→縦書用に位置調整するWordVBAを作って遊んでいた。

なんか
「ん゛ほぉ♥」
とかいう文字列をよく使うので
縦書きにしたときに「゛」をどうするのかという問題にぶち当たりました。

で、今までは組版のことなんて考えていなかったのでどうでもよかったんですが
いい加減何とかしないといけない気がしてきたので
何とかしようと思いました。

同人活動して物理本出してる淫語クラスタの人は
皆さんどうしてるんでしょうか。
聞けばいいものの(前にちょろっと聞いたものの)
なんとなくいい解決方法に思えなかったので
自分なりに何とかしてみようと思いました。

一番よく聞く「Microsoft Word」でやります。
多分私も世話になることになるソフトとおもうので。
あどべうんたら?しらん。

ピンとこない方に説明しますと、
「゛」を文字につけるということは
横書きと縦書きでこのような問題があります。
下の画像の選択文字をごらんくださいまし(横書:サクラエディタ/縦書:Word)。
濁点置換1
・まずもってそもそも
 濁点が、濁点の付く文字の
 前にあるべきか
 後ろにあるべきかが違う
・これを妥当に前に持ってきたとしても
 「゛」はあらぬ場所についてしまい
 横書きの時に我慢で来ていたレベルを超えて、ハチャメチャ。

さてどうしたものかということで、
今までほとんど触ったことのないWordVBAを触ってみました。
ExcelVBAはぼちぼち触ってるんですが
Wordのはほとんど触ったことがありませんで一苦労でした。

それ以前にWordの機能自体もよくわかっていません。

まず
「濁点の位置を調節するのにどういう機能を使えばいいのか」
・位置自体は「フォント」設定にて、
 字間と位置をいじればなんとかなるっぽい。
・上記の通り、「゛」を1文字前に移動しなければならない。
概ねこの二点かな。

字間と位置を調節すると行間がぶっ壊れるので、
行間を固定値に設定します。
濁点置換0

で、場当たりで作ってみました。

・文書中に登場する「゛」すべてを、自身の前の文字のさらに前へ移動する。
・「゛」の文字を自身がかかるべき文字のなんかそれっぽい位置へずらす。
を一括処理します。

濁点置換2
濁点の位置を現在のフォントサイズから
自動で割り出そうかと思ったんですが
フォント種類によっててんでばらばらの動きをするので
手動で設定するようにしました。

入力した数値分、字間をマイナス(狭く)し、
同じ数値分、位置を「上げ」ます。
横書きベースのパラメータ名なので
縦書きにしたときに「上げる」って
なんだかよくわかりませんが。
カーソルを一文字前にもっていくのがleftだったりして
縦書きベースで考えてると混乱がひどい。

んで、
それでも値はどれくらいが塩梅かよくわからないので
前提としてトライアンドエラーにします。

「適当に値を入れながら繰り返して丁度いいところで決めて」って感じです。
パラメータ入力2種類だから2種類求めようかと思ったんですが
大雑把に同じ値でよさそうだったので同値。
この場合なんか1.5とか入れると丁度良い感じになったのでそういう感じに。

濁点置換3
やり直しできるように
自動で前の状態に戻すアンドゥ機能を乗っけておきました。
アンドゥの戻りポイントを記憶しておけるようなので、それを使いました。
GOTO文みたいで気持ち悪い…。

処理後。
濁点置換4
まあ一応濁点の位置はそれっぽくなりました。
それ以外の禁則とかは全然気にできてませんが。

まあ、VBAでボタン一つでぽんとできるのなら、
事前処理としては使いでもあるかもしれません。
リボンに登録だけしときました。使うかどうかは別として。
濁点置換5

もうちょいカーニング的なものがどうにかならんかとは思いますが
よくわかんないので今日はこの辺で終わり。

そんなかんじ。


つかいたければどうぞ
---------------------------------------------------------------------
Sub 濁点移動()

    '予め文書全体の行間隔を「固定」へ変更してください。
    '(レイアウト->「段落」グループの右下詳細を開く->「インデントと行間隔」タブ にあります。)
    '間隔の数値は文字フォントサイズごとに相談して適当に決めてください。
    '濁点の位置を無理やりずらすため、これをやらないと行間がめちゃくちゃに崩れます。
    
    '「゛」を、前の文字の前に移動し、それっぽい位置をずらします。
    '横書きでは「ん゛ほぉ゛」という文字列を縦書きへ直す場合
    '「゛」をかかる文字の前に移動した方が整形し易いため。
    
    '開始時に数値を入力します。これは「゛」の水平垂直位置を調節して移動するパラメータです。
    '自動化しようと思いましたがフォントごとに感じが違うので確認しながら手で入れてください。
    '処理後にやり直すか問い合わせが出ます。
    
    '位置が気に食わなければ「はい」、これでよければ「いいえ」を選べば濁点の位置調整が完了です。
    
    
    Dim ur As Word.UndoRecord   'アンドゥ用おまじない
    
    Dim tgttxt As String        '変数定義:対象ダミー文字列
    Dim prm As Integer          '変数定義:ずらしパラメータ

    Const tgttxt = "@"         '対象ダミー文字:文書中に@が登場する場合はなんかに変える
    
    
    prm = InputBox("濁点設置位置を入力してください。" & vbCrLf & "なんか数値分濁点の位置がずれます。")
    
    MsgBox "「゛」の位置をずらします。", vbInformation
    
    'アンドゥ記録開始
    Set ur = Application.UndoRecord
    ur.StartCustomRecord "My Custom Undo"
    
    
    '一旦ダミー文字へ置換する。マクロ記録から削っただけのベタ。よくわからん。
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "゛"
        .Replacement.Text = tgttxt
        .Forward = True
        .Wrap = wdFindContinue
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
    
    Selection.HomeKey Unit:=wdStory     'カーソルを先頭へ
    
    '対象ダミー文字を切り取り、さらに1文字分上へ(かかる文字の上へ)移動しながら「゛」へ置換する
    '置換というか消して入力してる。
    Selection.Find.Text = tgttxt        '対象文字を決定
    Do While Selection.Find.Execute     '対象文字が見つかる限り反復
        With Selection.Find
            .ClearFormatting
            .Text = tgttxt
            .Execute Forward:=True
        End With
        
        Selection.Delete                                '消して
        Selection.MoveLeft Unit:=wdCharacter, Count:=1  'カーソル動かして
        Selection.TypeText Text:="゛"                   '「゛」入力
        
        '「゛」をselectして位置調整
        Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
        With Selection.Font
            .Spacing = prm * -1
            .Position = prm
        End With
    
        Selection.HomeKey Unit:=wdStory '先頭から再検索
    Loop
    
    'アンドゥ記録ここまで
    '戻すか問い合わせ
    ur.EndCustomRecord
    If MsgBox("処理が完了しました。" & vbCrLf & "位置が気に食わなければ取り消せます。" & vbCrLf & "取り消しますか?", vbYesNo) = vbYes Then
        ActiveDocument.Undo
    End If
    
    Set ur = Nothing
 
 
End Sub

この記事へのコメント

コメントをお寄せ下さい

(コメント編集・削除に必要)
(管理者にだけ表示を許可する)

トラックバック

この記事のトラックバックURL
http://monostation.blog112.fc2.com/tb.php/2573-d77fca48

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。