
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}
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 \accent
Grundelement mit Cut&Stitch zu bearbeiten, aber ohne Erfolg.
(Viertes Quartal) Gibt es einen besseren Weg als den, den ich mir vorstellen kann?
Ich verwende LaTeX
und 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.txt
im 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 \char
und nicht direkt eingefügt werden, da dies einfacher war. Ich kann es später ändern.