Skip to content

Commit acb8685

Browse files
committed
Add \ifbeginwithCJKtoken and \ifendwithCJKtoken.
1 parent c3bd4ca commit acb8685

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

doc/biblatex-japanese.pdf

2.08 KB
Binary file not shown.

doc/biblatex-japanese.tex

+16
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ \subsection{和文文字判定}
159159
文献データベース自体に\bibfield{langid}といった言語情報を付加しておくことである.
160160
しかし,このような情報をいちいち付加するのは面倒であるし,
161161
フィールド毎に和文文字を含むかどうかで動作を変更できると便利である.
162+
このためのテストコマンドを準備しておく.
162163

163164
\begin{ltxsyntax}
164165
\cmditem{ifCJKtokens}{tokens}{true code}{false code}
@@ -167,6 +168,21 @@ \subsection{和文文字判定}
167168
コードポイントの文字が含まれていれば\prm{true code}を実行し,
168169
そうでなければ\prm{false code}を実行する.
169170
テストは一度\prm{tokens}を完全展開してから行われる.
171+
172+
なお,Unicodeであることを前提にしているので,p\TeX の場合は
173+
怪しい動作になる.どうなるのかをちゃんと理解したら対策するかもしれない.
174+
175+
\cmditem{ifbeginwithCJKtoken}{tokens}{true code}{false code}
176+
177+
\prm{tokens}の先頭にU+2E80以上のコードポイントの文字があれば
178+
\prm{true code}を実行し,そうでなければ\prm{false code}を実行する.
179+
テストは一度\prm{tokens}を完全展開してから行われる.
180+
181+
\cmditem{ifendwithCJKtoken}{tokens}{true code}{false code}
182+
183+
\prm{tokens}の末尾にU+2E80以上のコードポイントの文字があれば
184+
\prm{true code}を実行し,そうでなければ\prm{false code}を実行する.
185+
テストは一度\prm{tokens}を完全展開してから行われる.
170186
\end{ltxsyntax}
171187

172188
\subsection{置換コマンド}

latex/biblatex-japanese.def

+36-3
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,50 @@
2525

2626
%% --- User commands ---
2727
\ExplSyntaxOn
28-
28+
\cs_new:Nn \blxja_if_CJKtoken:nTF {
29+
\token_if_cs:NTF #1 {#3} {
30+
\int_compare:nNnTF {`#1} > {"2E7F} {#2} {#3} % ToDo: change CJK chars range
31+
}
32+
}
33+
\cs_new:Nn \blxja_if_CJKtoken:nT {\blxja_if_CJKtoken:nTF {#1} {#2} {}}
2934
\DeclareDocumentCommand{\ifCJKtokens}{ m m m }{
30-
\tl_set:Nx \l_tmpa_tl {#1}
35+
\tl_set:Nx \l_tmpa_tl { \tl_to_str:n {#1} }
3136
\bool_set_false:N \l_tmpa_bool
3237
\tl_map_inline:Nn \l_tmpa_tl {
3338
\token_if_cs:NF ##1 {
34-
\int_compare:nNnT {`##1} > {"2E7F} {\bool_set_true:N \l_tmpa_bool} % ToDo: change CJK chars range
39+
\blxja_if_CJKtoken:nT {##1} {\bool_set_true:N \l_tmpa_bool}
3540
}
3641
}
3742
\bool_if:NTF \l_tmpa_bool {#2} {#3}
3843
}
44+
\cs_generate_variant:Nn \blxja_if_CJKtoken:nTF {fTF}
45+
\cs_generate_variant:Nn \tl_if_head_is_group:nTF {oTF}
46+
\DeclareDocumentCommand{\ifbeginwithCJKtoken}{ m m m }{
47+
\tl_set:Nf \l_tmpa_tl { \tl_head:f {#1} }
48+
\tl_if_head_is_group:oTF { \l_tmpa_tl }{
49+
\tl_set:Nf \l_tmpa_tl { \exp_last_unbraced:No \use:n \l_tmpa_tl }
50+
\ifbeginwithCJKtoken { \l_tmpa_tl } {#2} {#3}
51+
}{
52+
\blxja_if_CJKtoken:fTF { \l_tmpa_tl } {#2} {#3}
53+
}
54+
}
55+
\cs_generate_variant:Nn \tl_if_single:nTF {oTF}
56+
\DeclareDocumentCommand{\ifendwithCJKtoken}{ m m m }{
57+
\tl_set:Nf \l_tmpa_tl { #1 }
58+
\tl_if_single:oTF \l_tmpa_tl {} {
59+
\tl_set:Nf \l_tmpa_tl { \tl_tail:f {\l_tmpa_tl} }
60+
}
61+
\tl_if_head_is_group:oTF { \l_tmpa_tl }{
62+
\tl_set:Nf \l_tmpa_tl { \exp_last_unbraced:No \use:n \l_tmpa_tl }
63+
\ifendwithCJKtoken { \l_tmpa_tl } {#2} {#3}
64+
}{
65+
\tl_if_single:oTF {\l_tmpa_tl} {
66+
\blxja_if_CJKtoken:fTF { \l_tmpa_tl } {#2} {#3}
67+
} {
68+
\ifendwithCJKtoken { \l_tmpa_tl } {#2} {#3}
69+
}
70+
}
71+
}
3972
\ExplSyntaxOff
4073

4174
\DeclareDocumentCommand{\replacecommand}{ s }{%

0 commit comments

Comments
 (0)