すべての大文字の発音区別符号を消す

すべての大文字の発音区別符号を消す

発音区別符号付きのすべての大文字は、対応する裸の大文字と同じ高さ (深さ) にする必要があります。

モチベーション: ベースラインをストレッチするときに通常のベースライン グリッドを取得することはできません。

いじってみるMWEはこちら

\documentclass{standalone}

\usepackage[utf8]{inputenc}

\let\oldAcute\' \def\'#1{\protect\vphantom{#1}\smash{\oldAcute#1}}     % 1)
\let\oldHacek\v \def\v#1{\protect\vphantom{#1}\smash{\oldHacek#1}}     % 2)
\DeclareUnicodeCharacter{00C7}{\protect\vphantom{C}\smash{\c C}}       % 3)

\setlength\fboxsep{0pt}
\let\MU\MakeUppercase

\begin{document}
  \fbox{\fbox{A}\fbox{Á}\fbox{\'{A}}\fbox{\MU{á}}\fbox{\MU{\'{a}}}}
  \fbox{\fbox{C}\fbox{Č}\fbox{\v{C}}\fbox{\MU{č}}\fbox{\MU{\v{c}}}}
  \fbox{\fbox{C}\fbox{Ç}\fbox{\c{C}}\fbox{\MU{ç}}\fbox{\MU{\c{c}}}}
\end{document}

ゼ・レズルト

私の文書は UTF8 でエンコードされているので、例の方法で3)十分です。欠点:

  • マクロで入力された発音区別符号は影響を受けません
  • 長いコマンドリストのコンパイルが必要

実現可能です。ただし、マクロの使用については気にしないようにしたいと思います。また、発音区別符号が多数含まれる言語を 2 つ以上使用しています。リストを書くのは面倒になります。

Q1) 少なくともこの最後のタスクは自動化できますか?(Q2) アクセント付き文字 (またはその Unicode ID) から裸の文字を復元する一般的な方法を知るだけでも、前進になります。

別の暫定的な解決策が example で示されています2)。必要なすべての状況で機能しているように見えますが、counterexample で示されているように、実際には役に立たないものです1)。(私のドキュメントは UTF8 でエンコードされていることに注意してください。)

Q3) 修正方法は1)ありますか?

プリミティブでカット&ステッチも試しましたが\accent、効果はありませんでした。

Q4) 私が考えついた方法よりも良い方法はあるでしょうか?

私は使用していますLaTeXが、今後もそれを使い続けたいと思っています。 当然ながら、他のエンジンで実行される洗練されたソリューションを見るのは興味深いでしょう。

答え1

まず第一に、コメントであなたが言おうとしていることを、プロジェクトの責任者に必ず伝える必要があります。ここであなたが求めているのは、対処する必要のない誤った決定の結果です。ここであなたがやっていることは、主要な問題に取り組むことができないため、これらの誤った決定を回避することだけです。

さて、それを知っていれば、回避策3は、Unicode 文字データベース(参照詳細な説明) は、分解マッピングを持っているため、Lua で実行できます。次の Lua スクリプトは、まさにそれを実行します (現在のディレクトリに がある場合)。これを(ライブラリが必要なので、通常の Lua ではなく)UnicodeData.txtで処理できます。texlualpeg

local P, C, Ct = lpeg.P, lpeg.C, lpeg.Ct
local semicolon = P';'
local field = C((1 - semicolon)^1)
local linepatt = field * (semicolon * field)^0

local space = P' '
local singlechar = C((1 - space)^1)
local ltsign = P'<'
local initchar = C((1 - space - ltsign)^1)
local nfdpatt = Ct(initchar * (space * singlechar)^0)

texaccents = {
    ['0300'] = '\\`',
    ['0301'] = "\\'",
    ['0302'] = '\\^',
    ['0303'] = '\\~',
    ['0308'] = '\\"',
    ['030B'] = '\\H',
    ['030A'] = '\\r',
    ['030C'] = '\\v',
    ['0306'] = '\\u',
    ['0304'] = '\\=',
    ['0307'] = '\\.',
    ['0328'] = '\\k'
}
for line in io.lines('UnicodeData.txt') do
  local usv, _, _, _, _, nfd = linepatt:match(line)
  if nfd then
    local chars = nfdpatt:match(nfd)
    if chars and #chars > 1 then
      local base = chars[1]
      smashedchr = '\\char"' .. base
      for i = 2, #chars do
        local diac = texaccents[chars[i]]
        if diac then
          smashedchr = diac .. '{' .. smashedchr .. '}'
        else
          break
        end
      end

      print('\\DeclareUnicodeCharacter{' .. usv .. '}{\\protect\\vphantom{\\char"' .. base .. '}\\smash{' .. smashedchr .. '}}')
    end
  end
end

出力される最初の数行は次のとおりです。

\DeclareUnicodeCharacter{00C0}{\protect\vphantom{\char"0041}\smash{\`{\char"0041}}}
\DeclareUnicodeCharacter{00C1}{\protect\vphantom{\char"0041}\smash{\'{\char"0041}}}
\DeclareUnicodeCharacter{00C2}{\protect\vphantom{\char"0041}\smash{\^{\char"0041}}}
\DeclareUnicodeCharacter{00C3}{\protect\vphantom{\char"0041}\smash{\~{\char"0041}}}
\DeclareUnicodeCharacter{00C4}{\protect\vphantom{\char"0041}\smash{\"{\char"0041}}}
\DeclareUnicodeCharacter{00C5}{\protect\vphantom{\char"0041}\smash{\r{\char"0041}}}

基本文字は\char、 と を使用して直接含めるのではなく、その方が簡単であるため、後で変更できることに注意してください。

関連情報