메타포스트에서 유니코드 문자를 지원하는 방법은 무엇입니까?

메타포스트에서 유니코드 문자를 지원하는 방법은 무엇입니까?

mpost를 통해 컴파일하는 메타포스트 파일이 있습니다. 이 파일에는 라텍스에 파일을 포함할 때 표시할 수 없는 특수 문자가 포함되어 있습니다. 라텍스에 inputenc utf8이 필요했습니다.

이에 대한 답을 아는 사람이 있나요?

답변1

당신은 당신의 환경에 대해 많이 말하지 않으므로 추측합니다.

Metapost에서 유니코드 문자를 설정하는 세 가지 방법은 다음과 같습니다.

전통 라텍스

레이블 문자열에 UTF8을 사용하려면 다음과 같이 하면 됩니다.

prologues := 3;
outputtemplate := "%j%c.eps";
verbatimtex 
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
etex
beginfig(1);
label.top(btex sprichwörtlichen etex, origin);
draw (left--right) scaled 2cm;
endfig;
end.

이를 처리하는 데 사용할 Metapost를 얻으려면 latex다음을 사용하여 컴파일해야 합니다.

mpost -tex=latex <filename>

내 시스템에서는 다음이 생성됩니다.

여기에 이미지 설명을 입력하세요

utf8이 설정을 사용하면 인코딩이 알고 있는 모든 유니코드 문자를 사용할 수 있습니다 . 생성된 파일을 파일 에 포함하기 전에 파일 .eps로 변환하는 것이 더 편리할 수 있습니다 ..pdf.tex

최신 LuaLaTeX

lualatex오늘 제가 개인적으로 선호하는 것은 라이브러리를 사용한 모든 Metapost 작업에 사용하는 것입니다 luamplib. 장점은 전체 fontspec환경이 자신에게 맞게 작동하고 설치된 적절한 OTF 글꼴을 사용할 수 있다는 것입니다. 여기에서는 Linux Libertine O다양한 범위의 유니코드 문자가 정의된 글꼴을 사용했습니다 .

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
    label.top("☞ sprichwörtlichen", origin);
    draw (left--right) scaled 2cm;
endfig;
\end{mplibcode}
\end{document}

이것을 컴파일하면 lualatex <filename>다음이 생성됩니다.

여기에 이미지 설명을 입력하세요

기본 LaTeX 엔진으로 채택할 준비가 되지 않은 경우 lualatex여기에서 수행한 작업을 수행하고 standalone클래스를 사용하여 MP 그래픽용 독립 실행형 PDF 파일을 생성할 수 있습니다.

구식 일반 Metapost

(진짜 이러지 마세요...)

LaTeX를 전혀 사용하지 않고 구식 일반 Metapost를 사용하고 싶다면 내장된 infont연산자를 사용하여 최소한 UTF8의 하위 집합을 지원할 수 있습니다.

다음 MP 프로그램을 고려하십시오.

prologues := 3;
outputtemplate := "%j%c.eps";

def U primary s = if string s: decode(s) fi enddef;

vardef decode(expr given) = 
    save a, i, s, out; string s, out; numeric a, i;
    out = ""; i=0;
    forever:
        s := substring (i, incr i) of given; 
        a := ASCII s;
        if a < 128: 
        elseif a = 194: 
            s := substring (i, incr i) of given;
        elseif a = 195: 
            s := char (64 + ASCII substring (i, incr i) of given);
        else: 
            s := "?";
        fi
        out := out & s;
        exitif i >= length given;
    endfor
    out
enddef;

beginfig(1);
    defaultfont := "phvr8r";
    label.top(U"sprichwörtlichen", origin);
    draw (left--right) scaled 2cm;
endfig;
end.

mpost이는 옵션 없이 일반 old로 컴파일할 수 있으며 다음을 생성합니다.

여기에 이미지 설명을 입력하세요

그러나 간단하고 빠르고 더러운 루틴은 UTF8의 매우 제한된 하위 집합만 지원하며 수행하는 작업을 ISO8859-1로 변환하거나 사용된 인코딩 decode에서 제공하는 ISO8859-1에 가까운 근사치로 변환한다는 점에 유의하세요. 글꼴 8r과 함께 phvr8r. 반면 속도는 빠르다..

노트

  • 의 메인 루프는 decode문자열을 단계별로 실행하는 "매끄러운" 방법을 보여줍니다. 매크로 incr는 일반 MP에서 가져온 것입니다. 숫자 변수의 값을 1만큼 증가시킨 다음 해당 값을 반환합니다. 이것이 바로 substring문자열의 각 문자를 읽는 데 사용해야 하는 것입니다 .

관련 정보