
해당 대문자와 동일한 높이(깊이)를 가지려면 발음 구별 부호가 있는 모든 대문자가 필요합니다.
동기 부여: 기준선을 늘일 때 일반 기준선 그리드를 얻는 것은 옵션이 아닙니다.
여기 땜질할 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개 이상 사용하고 있습니다. 목록을 작성하는 것은 짜증나는 일이 될 것입니다.
(1분기) 최소한 이 마지막 작업을 자동화할 수 있습니까? (2분기) 악센트가 있는 문자(또는 해당 유니코드 ID)에서 기본 문자를 복구하는 일반적인 방법을 아는 것만으로도 한 단계 더 발전할 수 있습니다.
또 다른 임시 솔루션이 예제로 제시됩니다 2)
. 필요한 모든 상황에서 작동하는 것처럼 보이지만 실제로는 반례에서 볼 수 있듯이 쓰레기입니다 1)
. (내 문서는 UTF8로 인코딩되어 있다는 점을 기억하세요.)
(3분기) 수정 사항이 1)
존재합니까?
나는 또한 프리미티브에 컷 앤 스티치를 시도했지만 \accent
소용이 없었습니다.
(4분기) 내가 생각하는 것보다 더 나은 다른 방법이 존재합니까?
을(를) 사용하고 LaTeX
있으며 계속 사용하고 싶습니다.
다른 엔진에서 실행되는 매끄러운 솔루션은 당연히 흥미로울 것입니다!
답변1
우선, 댓글에서 당신이 거의 말하고 있는 내용을 프로젝트 책임자에게 반드시 알려야 합니다. 여기서 요청하는 것은 당신이 처리해서는 안 되는 잘못된 결정의 결과입니다. 여기서 당신이 하고 있는 일은 주요 문제를 해결할 수 없기 때문에 잘못된 결정을 피하는 것뿐입니다.
이제 이를 알고 계시다면 해결 방법 3은 다음을 사용하여 정말 쉽게 수행할 수 있습니다.유니코드 문자 데이터베이스(또한보십시오자세한 설명), 분해 매핑이 있기 때문입니다. Lua의 다음 스크립트는 이를 수행합니다( UnicodeData.txt
현재 디렉터리에 있는 경우). texlua
(라이브러리가 필요하기 때문에 일반 Lua가 아님 ) 로 처리할 수 있습니다 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
출력되는 처음 몇 줄은 다음과 같습니다.
\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
직접 포함되지 않고 를 사용하여 포함되는 것이 더 쉽기 때문에 포함됩니다. 나중에 변경할 수 있습니다.