정의되지 않았거나 사용할 수 없는 경우 작은 대문자 교체

정의되지 않았거나 사용할 수 없는 경우 작은 대문자 교체

에 따르면이 질문에 대한 훌륭한 대답작은 대문자 사용 가능 여부를 확인할 수 있습니다. 그러나 실제로 이 코드를 사용하려고 하면 이상한 결과가 나타납니다. 글꼴 모양이한정되지 않은교체가 예상대로 작동합니다. 글꼴 모양이 다음과 같을 때사용 불가테스트에 따르면 글꼴 모양을 사용할 수 있지만 Latex는 대신 대체 글꼴을 사용합니다.

\fakedsc일반 산세리프 작은 대문자에 로마자 버전이 아닌 다른 방법을 사용할 수 있나요 ?

다음 코드에서는 T1/lmr/bx/sc와 가 T1/lmss/bx/sc사용될 때 작은 대문자가 교체되는 것을 볼 수 있습니다(둘 다한정되지 않은) 하지만 언제는 아니다T1/lmss/m/sc 사용될 때는 그렇지 않습니다(사용 불가):

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

\newcommand{\fakedsc}[3][1]{#2\begingroup\smaller[#1]{\MakeUppercase{#3}}\endgroup}

\makeatletter
\def\define@newfont{%
    \begingroup
    \let\typeout\@font@info
    \escapechar\m@ne
    \expandafter\expandafter\expandafter
    \split@name\expandafter\string\font@name\@nil
    \try@load@fontshape % try always
    \expandafter\ifx
    \csname\curr@fontshape\endcsname \relax
    \expandafter\gdef\csname \curr@fontshape/sub\endcsname{}% new      
    \wrong@fontshape\else
    \extract@font\fi
    \endgroup}

\newcommand\testsc[3][1]{%
    \ifcsname \f@encoding/\f@family/\f@series/sc/sub\endcsname
    no \fakedsc[#1]{#2}{#3}
    \else 
    \ifcsname \f@encoding/\f@family/\f@series/sc\endcsname  yes \textsc{#2#3} \else no \fakedsc[#1]{#2}{#3} \fi
    \fi   
    }
\makeatother

\begin{document}

    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test successful, no replacement

    {\bfseries
    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

    \sffamily
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test \textbf{not successful}, auto replacement

    {\bfseries
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

\end{document}

결과는 다음과 같습니다. 교체품

편집하다:에서 도움이 되는 내용을 찾았습니다.source2e 문서. 166페이지 맨 위에는 다음과 같이 적혀 있습니다.

\curr@fontshape 조합을 사용할 수 없는 경우(즉 정의되지 않은 경우) 이 경우를 처리하기 위해 매크로 \wrong@fontshape를 호출합니다. 그렇지 않으면 \extract@font가 외부 글꼴을 로드합니다.

341% \expandafter\ifx

342% \csname\curr@fontshape\endcsname \relax

343 \try@load@fontshape % 항상 시도

344% \fi

345 \확장 후\ifx

346 \csname\curr@fontshape\endcsname \relax

347 \잘못@글꼴모양\else

대체를 허용하기 위해 우리는 일반적으로 \relax로 확장되지만 대체를 위한 코드를 보유할 수 있는 curr@fontshape 매크로를 호출합니다(\subst@fontshape 정의 참조).

348% \csname\curr@fontshape\endcsname

349 \추출@글꼴\fi

거의 완료되었으며 그룹을 닫아 \escapechar만 복원하면 됩니다.

350 \endgroup}

... 그래서 마법의 단어는한정되지 않은, 이는 다음과 같은 글꼴 모양에 대한 솔루션을 의미합니다.사용 불가(LaTeX 경고에 따르면 여전히 필요합니다).

편집2:

내가 이해하는 한도에서는,\testsc (경고로 이어짐).글꼴 모양이 T1/lmr/bx/sc정의되지 않음(Font) 사용T1/lmr/bx/n 대신 사용"를 \textsc사용하는 경우). 그런 다음 글꼴 모양이 존재하는지 테스트합니다. 어떤 이유로 이 테스트는 긍정적이지만 T1/lmss/m/sc경고 \textsc가 표시됩니다. "<10.95> 크기의 글꼴 모양을 T1/lmss/m/sc사용할 수 없음(글꼴) T1/lmr/m/sc대신 글꼴 모양을 시도함".이 경우 추가 테스트가 필요합니까? 첫 번째 경고와 달리 이 경고가 어떻게 생성되는지 알 수 없었습니다. 나는 이 경고에 대한 정의를 책 64페이지에서 찾았습니다.글꼴 설치 가이드. 테스트가 완료되기 전에 제품군이 변경된 것 같습니다. 이 경우에만 해당됩니다.

편집3:

"라는 내용을 자세히 살펴보았습니다.사용 불가" 경고. 이것은 다음에 의해 생성된 것으로 밝혀졌습니다.t1lmss.fd(MiKTeX 2.9/tex/latex/lm에 위치) 다른 대체 외에도 다음을 선언합니다.

\DeclareFontShape{T1}{lmss}{m}{sc}
{<->sub*lmr/m/sc}{}

서문에 다음 코드를 추가하여 대체 글꼴을 산세리프 글꼴의 일반 모양으로 변경할 수 있었습니다.

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern} \sffamily\selectfont
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

\DeclareFontShape{T1}{lmss}{m}{sc}
{<->sub*lmss/m/n}{}
\normalfont
...

새로운 출력은 다음과 같습니다. 새로운 교체품

이러한 종류의 대체에 대한 테스트를 수행하거나 "선언 취소"하는 것도 가능합니까?.fd 파일을 사용하지 않고?

부인 성명: 나는 작은 대문자를 위조할 때 발생하는 문제를 알고 있지만 다른 글꼴을 사용하는 것은 나에게 해결책이 아닙니다.

답변1

이후 마지막 단계편집3실제로는 매우 간단했습니다.t1lmss.fdtex 파일 자체에서 원하지 않는 코드를 삭제하십시오. 따라서 원본 fd 파일은 그대로 유지하면서 글꼴 모양 선언이 무시됩니다. 전체 tex 파일은 다음과 같습니다.

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern} %\sffamily\selectfont % (not needed if the whole fd file is inserted, which uses \DeclareFontFamily{T1}{lmss}{})
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

%%% taken from the .fd file (MiKTeX 2.9\tex\latex\lm\t1lmss.fd) -- this overrides the definitions in the fd file while leaving the original file untouched
\DeclareFontFamily{T1}{lmss}{}
\DeclareFontShape{T1}{lmss}{m}{n}
{<-8.5> ec-lmss8
    <8.5-9.5> ec-lmss9      <9.5-11>  ec-lmss10
    <11-15.5> ec-lmss12     <15.5-> ec-lmss17
}{}
\DeclareFontShape{T1}{lmss}{m}{it}
{<->ssub*lmss/m/sl}{}
\DeclareFontShape{T1}{lmss}{m}{sl}
{<-8.5> ec-lmsso8
    <8.5-9.5> ec-lmsso9      <9.5-11>  ec-lmsso10
    <11-15.5> ec-lmsso12     <15.5-> ec-lmsso17
}{}
%%%%%%% Font/shape undefined, therefore substituted
%\DeclareFontShape{T1}{lmss}{m}{sc}     % <-- deleted
%{<->sub*lmr/m/sc}{}                    % <-- deleted
\DeclareFontShape{T1}{lmss}{b}{n}
{<->ssub * lmss/bx/n}{}
\DeclareFontShape{T1}{lmss}{b}{sl}
{<->ssub * lmss/bx/sl}{}
\DeclareFontShape{T1}{lmss}{b}{it}
{<->ssub * lmss/bx/it}{}
%%%%%%%% semibold condensed series
\DeclareFontShape{T1}{lmss}{sbc}{n}
{<-> ec-lmssdc10}{}
\DeclareFontShape{T1}{lmss}{sbc}{sl}
{<-> ec-lmssdo10}{}
\DeclareFontShape{T1}{lmss}{sbc}{it}
{<->ssub*lmss/sbc/sl}{}
%%%%%%%%% bold extended series
\DeclareFontShape{T1}{lmss}{bx}{n}
{<-> ec-lmssbx10}{}
\DeclareFontShape{T1}{lmss}{bx}{sl}
{<-> ec-lmssbo10}{}
\DeclareFontShape{T1}{lmss}{bx}{it}
{<->ssub*lmss/bx/sl}{}
%%% end of fd file
\normalfont

\newcommand{\fakedsc}[3][1]{#2\begingroup\smaller[#1]{\MakeUppercase{#3}}\endgroup}

\makeatletter
\def\define@newfont{%
    \begingroup
    \let\typeout\@font@info
    \escapechar\m@ne
    \expandafter\expandafter\expandafter
    \split@name\expandafter\string\font@name\@nil
    \try@load@fontshape % try always
    \expandafter\ifx
    \csname\curr@fontshape\endcsname \relax
    \expandafter\gdef\csname \curr@fontshape/sub\endcsname{}% new      
    \wrong@fontshape\else
    \extract@font\fi
    \endgroup}

\newcommand\testsc[3][1]{%
    \ifcsname \f@encoding/\f@family/\f@series/sc/sub\endcsname
    no \fakedsc[#1]{#2}{#3}
    \else 
    \ifcsname \f@encoding/\f@family/\f@series/sc\endcsname  yes \textsc{#2#3} \else no \fakedsc[#1]{#2}{#3} \fi
    \fi   
    }
\makeatother

\begin{document}

    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test successful, no replacement

    {\bfseries
    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

    \sffamily
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test finally successful, \detokenize{\fakedsc} used!!!

    {\bfseries
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

\end{document}

보시다시피 \sffamily \textsc{Test}이제 글꼴 모양이 다음과 같다는 경고가 표시됩니다.정의되지 않은:

정의되지 않은 경고

그러나 모든 \textsc{Test}부분이 삭제되면 경고가 표시되지 않습니다. 어쩌면 원하는 경우 가짜 작은 대문자가 사용된다고 경고할 수도 있습니다(저에게는 그렇지 않습니다).

더 나은 점: \sffamily \testsc{Tested}포기하지 않음아니요대답으로 (글꼴 모양이정의되지 않음) \fakedsc의도한 대로 사용합니다.

성공적인 교체

힘든 작업이었는데 드디어 해결해서 기쁘네요. 더 깨끗한 솔루션이 있다면 기꺼이 배우겠습니다.

부인 성명:

이 솔루션은 귀하의 책임하에 그리고 귀하가 다음 사항을 준수할 수 있는 경우에만 사용하십시오.끔찍한결과.

관련 정보