
によるとこの質問に対する素晴らしい答えスモールキャップスが使用可能かどうかをチェックすることは可能です。しかし、このコードを実際に使用しようとすると、奇妙な結果になります。フォントの形状が未定義置換は期待通りに動作します。フォントの形状が利用不可テストではフォント形状が使用可能であると表示されますが、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 \expandafter\ifx
346 \csname\curr@fontshape\endcsname \relax
347 \wrong@fontshape\else
置換を可能にするために、通常は \relax に展開されるが、置換用のコードが保持される可能性がある curr@fontshape マクロを呼び出します (\subst@fontshape の定義を参照)。
348 % \csname\curr@fontshape\endcsname
349 \extract@font\fi
ほぼ完了しており、グループを閉じて \escapechar を復元するだけです。
350 \endgroup}
...魔法の言葉は未定義フォントの形状に対する解決策を意味します利用不可(LaTeX の警告によると、依然として必要です)。
編集2:
私の理解する限りでは、\testsc
置換をテストします(これは警告「フォント形状がT1/lmr/bx/sc
未定義(フォント)T1/lmr/bx/n
なので代わりに使用"\textsc
が使用されている場合)。次に、フォント形状が存在するかどうかをテストします。何らかの理由で、このテストは陽性ですT1/lmss/m/sc
が、\textsc
警告が表示されます "T1/lmss/m/sc
サイズ <10.95> のフォント形状は使用できません (フォント)T1/lmr/m/sc
代わりにフォント形状を試しました「」。この場合、追加のテストは必要ですか? 最初の警告とは対照的に、この警告がどのように生成されるのかは分かりませんでした。この警告の定義は、フォントインストールガイドこの場合のみ、テストが実行される前にファミリが変更されたようです。
編集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.fdそして、tex ファイル自体の不要なコードを削除します。こうすることで、フォント シェイプの宣言が上書きされ、元の 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
意図したとおりに使用します。
それは大変な作業でしたが、ようやく解決できてよかったです。もっとわかりやすい解決策があれば、ぜひ教えてください。
免責事項:
このソリューションは、あなた自身の責任で、そして、最悪結果。