
텍스트의 일부 문자를 사용하여 특별한 작업을 수행하고 싶습니다. 이 예에서는 굵게 표시되어 있습니다.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\newcommand\<[1]{\textbf{#1}}
\begin{document}
f\<oo b\<ar b\<öll
\end{document}
이는 첫 번째 두 가지 경우에는 잘 작동하지만 ASCII가 아닌 문자 "ö"에는 작동하지 않습니다. 오류 메시지가 있습니다
! Package inputenc Error: Unicode char \u8:\check@icr not set up for use with LaTeX.
이는 utf8에서 "ö"를 구성하는 두 바이트 사이에 보고됩니다.
나는 이것이 XeLaTeX 또는 LuaLaTeX에서 작동한다는 것을 알고 있습니다(inputenc 줄을 제거하면 됩니다). pdfLaTeX 및 (DVI)LaTeX에서는 작동하지 않습니다.
한 가지 해결 방법은
\<{ö}
.하지만 해결 방법 없이 pdflatex와 함께 작동하도록 하는 방법이 있습니까?
(실제 응용 프로그램에서는 활성 문자가 사용됩니다. 왜냐하면 소스 텍스트의 보기를 가능한 한 적게 방해하는 것이 중요하기 때문입니다.)
답변1
이렇게 할 수는 있지만 꼭 해야 할지 모르겠습니다. :-)
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
%\newcommand\<[1]{\textbf{#1}}
\makeatletter
\def\<{\expandafter\zz}
\def\zz#1{%
\ifx\UTFviii@two@octets#1% could be 3 or 4 octets, but not today
\expandafter\zztwo
\else
\expandafter\zzone{#1}%
\fi}
\def\zztwo#1#2{\zzone{\UTFviii@two@octets#1#2}}
\makeatother
\def\zzone#1{\textbf{#1}}
\begin{document}
f\<oo b\<ar b\<öll
f\<{o}o b\<ar b\<{ö}ll
\end{document}
답변2
LaTeX가 아닌 답변에 대해 유감스럽게 생각합니다.~할 수 있다UTF-8 코드를 일반 8비트 pdftex의 하나의 토큰으로 처리하면 David와 egreg의 답변에 표시된 합병증을 피할 수 있습니다. UTF-8로 인코딩된 파일을 생성해 볼 수 있습니다.
\input lmfonts
\def\<#1{{\bf#1}}
f\<oo b\<öll €\<€ f\<{oö} f\< öo
\bye
로 처리합니다 pdftex -fmt csplain test.tex
.
설명: 형식은 csplain
입력 프로세서 수준에서 UTF-8 코드를 해석하고 토큰 프로세서에 단일 토큰(바이트 또는 제어 시퀀스)으로 반환할 수 있는 pdfTeX의 encTeX 확장으로 생성됩니다. 로그로 돌아가서 \write
원래 UTF-8 코드를 파일로 저장할 수 있습니다.
답변3
3바이트 및 4바이트 UTF-8 문자의 경우도 포함하는 일반적인 답변입니다. \<ö
또는 \<{ö}
허용됩니다. 마지막 예와 같이 공백이 생기면 제거됩니다.
잘못된 입력을 포착하기 위해 제어 시퀀스에 대한 테스트를 추가해야 할 수도 있습니다. 문자나 {
뒤에 만 있으면 \<
안전합니다.
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{lmodern}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\<}{}
{
\pst_boldify:
}
\tl_new:N \l__pst_first_byte_tl
\cs_new_protected:Npn \pst_boldify:
{
\peek_catcode_ignore_spaces:NTF \c_group_begin_token
{
\textbf
}
{
\pst_boldify_aux:N
}
}
\cs_new_protected:Npn \pst_boldify_aux:N #1
{
\tl_set:Nx \l__pst_first_byte_tl
{
\int_compare:nT { `#1 < 128 } { 0 }
\int_to_bin:n { `#1 }
}
\regex_replace_once:nnN { 0[01]*\Z } { } \l__pst_first_byte_tl
\str_case:on { \l__pst_first_byte_tl }
{
{ } { \textbf { #1 } }
{ 11 } { \pst_do_bold:nn { #1 } }
{ 111 } { \pst_do_bold:nnn { #1 } }
{ 1111 } { \pst_do_bold:nnnn { #1 } }
}
}
\cs_new_protected:Npn \pst_do_bold:nn #1 #2
{
\textbf{#1#2}
}
\cs_new_protected:Npn \pst_do_bold:nnn #1 #2 #3
{
\textbf{#1#2#3}
}
\cs_new_protected:Npn \pst_do_bold:nnnn #1 #2 #3 #4
{
\textbf{#1#2#3#4}
}
\ExplSyntaxOff
\begin{document}
f\<oo b\<öll €\<€ f\<{oö} f\< öo
\end{document}
아이디어는 다음 토큰(공백을 제거한 후)이 중괄호이면 \textbf
실행된다는 것입니다. 그렇지 않으면 다음 토큰을 검사하여 이진 형식의 문자 코드로 변환합니다. 우리가 관리해야 하는 UTF-8 문자가 1바이트, 2바이트, 3바이트 또는 4바이트인지 확인하기 위해 포함된 첫 번째 0부터 모든 것이 제거됩니다. 마지막으로 적절한 결정이 내려집니다.
정규식 대체 없이 산술 테스트를 수행할 수 있습니다. 그러면 의 정의는 다음 \pst_boldify_aux:N
과 같아야 합니다.
\cs_new_protected:Npn \pst_boldify_aux:N #1
{
\int_compare:nTF { `#1<128 }
{
\textbf
}
{
\int_compare:nTF { 192 <= `#1 < 224 }
{
\pst_do_bold:nn { #1 }
}
{
\int_compare:nTF { 224 <= `#1 < 240 }
{
\pst_do_bold:nnn { #1 }
}
{
\pst_do_bold:nnnn { #1 }
}
}
}
}
나머지는 그대로 유지합니다( l3regex
더 이상 로딩이 필요하지 않다는 점 제외).