
Ich möchte mit einigen Zeichen im Text etwas Besonderes machen. In diesem Beispiel werden sie einfach fett hervorgehoben:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\newcommand\<[1]{\textbf{#1}}
\begin{document}
f\<oo b\<ar b\<öll
\end{document}
Dies funktioniert für die ersten beiden Fälle einwandfrei, jedoch nicht für das Nicht-ASCCI-Zeichen "ö". Es gibt eine Fehlermeldung
! Package inputenc Error: Unicode char \u8:\check@icr not set up for use with LaTeX.
das zwischen den beiden Bytes angegeben wird, die in UTF-8 „ö“ bilden.
Ich weiß, dass dies mit XeLaTeX oder LuaLaTeX funktioniert (einfach durch Entfernen der Zeile inputenc). Es funktioniert nicht mit pdfLaTeX und (DVI)LaTeX.
Eine Problemumgehung besteht darin, zu schreiben
\<{ö}
.Aber gibt es eine Möglichkeit, dies ohne diesen Workaround mit pdflatex zum Laufen zu bringen?
(In der tatsächlichen Anwendung wird ein aktives Zeichen verwendet, da es darum geht, etwas zu haben, das die Sicht auf den Quelltext möglichst wenig stört.)
Antwort1
Sie können das tun, aber ich bin nicht sicher, ob Sie das tun sollten :-)
\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}
Antwort2
Es tut mir leid, dass meine Antwort nicht in LaTeX erfolgte, aber ich möchte damit sagen, dass wirdürfenBehandeln Sie UTF-8-Codes als ein Token in einem normalen 8-Bit-PDFTEX und wir können die in den Antworten von David und Egreg gezeigten Komplikationen vermeiden. Sie können versuchen, die UTF-8-codierte Datei zu erstellen:
\input lmfonts
\def\<#1{{\bf#1}}
f\<oo b\<öll €\<€ f\<{oö} f\< öo
\bye
und verarbeiten Sie es durch pdftex -fmt csplain test.tex
.
Erklärung: Das Format csplain
wird mit der Erweiterung encTeX von pdfTeX generiert, die UTF-8-Codes auf Eingabeprozessorebene interpretieren und als einzelne Token (Byte oder Steuersequenz) an den Token-Prozessor zurückgeben kann. Es kann \write
die ursprünglichen UTF-8-Codes zum Protokoll und zu den Dateien zurückgeben.
Antwort3
Eine allgemeine Antwort, die auch die Fälle von drei- und vierbyteigen UTF-8-Zeichen abdeckt; \<ö
oder \<{ö}
ist zulässig. Wenn sich ein Leerzeichen einschleicht, wie im letzten Beispiel, wird es entfernt.
Vielleicht sollte ein Test für eine Steuersequenz hinzugefügt werden, um falsche Eingaben zu erkennen; solange Sie nur Zeichen oder {
danach haben \<
, sollte es sicher sein.
\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}
Die Idee ist, dass, wenn das nächste Token (nach dem Entfernen der Leerzeichen) eine Klammer ist, einfach \textbf
ausgeführt wird. Andernfalls wird das nächste Token untersucht und in einen Zeichencode in Binärform umgewandelt; alles wird bis auf die erste Null entfernt, um zu bestimmen, ob das zu verwaltende UTF-8-Zeichen ein, zwei, drei oder vier Bytes groß ist. Schließlich wird die entsprechende Entscheidung getroffen.
Ohne eine reguläre Ausdruckssubstitution kann ein arithmetischer Test durchgeführt werden; die Definition von \pst_boldify_aux:N
sollte dann sein
\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 }
}
}
}
}
Der Rest bleibt wie er ist (außer dass das Laden l3regex
nicht mehr erforderlich ist).