Diakritische Zeichen bei allen Großbuchstaben entfernen

Diakritische Zeichen bei allen Großbuchstaben entfernen

Ich möchte, dass alle Großbuchstaben mit diakritischen Zeichen die gleiche Höhe (Tiefe) wie der entsprechende nackte Großbuchstabe haben.

Motivation: Das Erhalten eines regelmäßigen Grundlinienrasters beim Strecken der Grundlinie ist keine Option.

Hier ist ein MWE zum Basteln

\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}

ZE REZULT

Mein Dokument ist UTF8-kodiert, daher 3)würde die Methode im Beispiel ausreichen. Nachteile:

  • Diakritische Zeichen, die mit Makros gesetzt werden, sind nicht betroffen
  • Zusammenstellung einer langen Liste von Befehlen ist notwendig

Es ist machbar. Aber ich möchte mir keine Gedanken über die Verwendung von Makros machen. Außerdem verwende ich eine Zahl größer als zwei von Sprachen, die voller diakritischer Zeichen sind. Das Schreiben der Liste wird nervig.

(Frage 1) Kann zumindest diese letzte Aufgabe automatisiert werden? (Fragebogen) Selbst wenn man nur eine allgemeine Methode kennt, um den nackten Buchstaben aus dem akzentuierten Zeichen (oder seiner Unicode-ID) wiederherzustellen, wäre das schon ein Fortschritt.

Eine weitere vorläufige Lösung wird von example präsentiert 2). Sie scheint in allen Situationen zu funktionieren, die ich brauche, ist aber in Wirklichkeit Mist, wie counterexample zeigt 1). (Denken Sie daran, dass mein Dokument UTF8-kodiert ist.)

(Drittes Quartal) Gibt es eine Lösung 1)?

Ich habe auch versucht, das \accentGrundelement mit Cut&Stitch zu bearbeiten, aber ohne Erfolg.

(Viertes Quartal) Gibt es einen besseren Weg als den, den ich mir vorstellen kann?

Ich verwende LaTeXund möchte dabei bleiben. Natürlich wäre es interessant, eine elegante Lösung zu sehen, die auf einer anderen Engine läuft!

Antwort1

Zunächst einmal müssen Sie dem Verantwortlichen des Projekts unbedingt mitteilen, was Sie in den Kommentaren fast sagen: Was Sie hier verlangen, sind die Konsequenzen schlechter Entscheidungen, mit denen Sie sich nicht befassen sollten. Alles, was Sie hier tun, ist, diese schlechten Entscheidungen zu umgehen, weil Sie das Hauptproblem nicht angehen können.

Wenn Sie sich dessen bewusst sind, können Sie Workaround 3 ganz einfach mit demUnicode-Zeichendatenbank(siehe auchdie detaillierte Beschreibung), weil es die Zerlegungszuordnungen hat. Das folgende Skript in Lua macht genau das (vorausgesetzt, Sie haben es UnicodeData.txtim aktuellen Verzeichnis). Sie können es mit verarbeiten texlua(nicht mit einfachem Lua, weil es die Bibliothek benötigt lpeg).

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

Hier sind die ersten paar ausgegebenen Zeilen:

\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}}}

Beachten Sie, dass die Basiszeichen mit \charund nicht direkt eingefügt werden, da dies einfacher war. Ich kann es später ändern.

verwandte Informationen