1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0-only 3# Copyright (C) Akira Yokosawa, 2024 4# 5# For "make pdfdocs", reports of build errors of translations.pdf started 6# arriving early 2024 [1, 2]. It turned out that Fedora and openSUSE 7# tumbleweed have started deploying variable-font [3] format of "Noto CJK" 8# fonts [4, 5]. For PDF, a LaTeX package named xeCJK is used for CJK 9# (Chinese, Japanese, Korean) pages. xeCJK requires XeLaTeX/XeTeX, which 10# does not (and likely never will) understand variable fonts for historical 11# reasons. 12# 13# The build error happens even when both of variable- and non-variable-format 14# fonts are found on the build system. To make matters worse, Fedora enlists 15# variable "Noto CJK" fonts in the requirements of langpacks-ja, -ko, -zh_CN, 16# -zh_TW, etc. Hence developers who have interest in CJK pages are more 17# likely to encounter the build errors. 18# 19# This script is invoked from the error path of "make pdfdocs" and emits 20# suggestions if variable-font files of "Noto CJK" fonts are in the list of 21# fonts accessible from XeTeX. 22# 23# References: 24# [1]: https://lore.kernel.org/r/8734tqsrt7.fsf@meer.lwn.net/ 25# [2]: https://lore.kernel.org/r/1708585803.600323099@f111.i.mail.ru/ 26# [3]: https://en.wikipedia.org/wiki/Variable_font 27# [4]: https://fedoraproject.org/wiki/Changes/Noto_CJK_Variable_Fonts 28# [5]: https://build.opensuse.org/request/show/1157217 29# 30#=========================================================================== 31# Workarounds for building translations.pdf 32#=========================================================================== 33# 34# * Denylist "variable font" Noto CJK fonts. 35# - Create $HOME/deny-vf/fontconfig/fonts.conf from template below, with 36# tweaks if necessary. Remove leading "# ". 37# - Path of fontconfig/fonts.conf can be overridden by setting an env 38# variable FONTS_CONF_DENY_VF. 39# 40# * Template: 41# ----------------------------------------------------------------- 42# <?xml version="1.0"?> 43# <!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> 44# <fontconfig> 45# <!-- 46# Ignore variable-font glob (not to break xetex) 47# --> 48# <selectfont> 49# <rejectfont> 50# <!-- 51# for Fedora 52# --> 53# <glob>/usr/share/fonts/google-noto-*-cjk-vf-fonts</glob> 54# <!-- 55# for openSUSE tumbleweed 56# --> 57# <glob>/usr/share/fonts/truetype/Noto*CJK*-VF.otf</glob> 58# </rejectfont> 59# </selectfont> 60# </fontconfig> 61# ----------------------------------------------------------------- 62# 63# The denylisting is activated for "make pdfdocs". 64# 65# * For skipping CJK pages in PDF 66# - Uninstall texlive-xecjk. 67# Denylisting is not needed in this case. 68# 69# * For printing CJK pages in PDF 70# - Need non-variable "Noto CJK" fonts. 71# * Fedora 72# - google-noto-sans-cjk-fonts 73# - google-noto-serif-cjk-fonts 74# * openSUSE tumbleweed 75# - Non-variable "Noto CJK" fonts are not available as distro packages 76# as of April, 2024. Fetch a set of font files from upstream Noto 77# CJK Font released at: 78# https://github.com/notofonts/noto-cjk/tree/main/Sans#super-otc 79# and at: 80# https://github.com/notofonts/noto-cjk/tree/main/Serif#super-otc 81# , then uncompress and deploy them. 82# - Remember to update fontconfig cache by running fc-cache. 83# 84# !!! Caution !!! 85# Uninstalling "variable font" packages can be dangerous. 86# They might be depended upon by other packages important for your work. 87# Denylisting should be less invasive, as it is effective only while 88# XeLaTeX runs in "make pdfdocs". 89 90# Default per-user fontconfig path (overridden by env variable) 91: ${FONTS_CONF_DENY_VF:=$HOME/deny-vf} 92 93export XDG_CONFIG_HOME=${FONTS_CONF_DENY_VF} 94 95notocjkvffonts=`fc-list : file family variable | \ 96 grep 'variable=True' | \ 97 grep -E -e 'Noto (Sans|Sans Mono|Serif) CJK' | \ 98 sed -e 's/^/ /' -e 's/: Noto S.*$//' | sort | uniq` 99 100if [ "x$notocjkvffonts" != "x" ] ; then 101 echo '=============================================================================' 102 echo 'XeTeX is confused by "variable font" files listed below:' 103 echo "$notocjkvffonts" 104 echo 105 echo 'For CJK pages in PDF, they need to be hidden from XeTeX by denylisting.' 106 echo 'Or, CJK pages can be skipped by uninstalling texlive-xecjk.' 107 echo 108 echo 'For more info on denylisting, other options, and variable font, see header' 109 echo 'comments of scripts/check-variable-fonts.sh.' 110 echo '=============================================================================' 111fi 112 113# As this script is invoked from Makefile's error path, always error exit 114# regardless of whether any variable font is discovered or not. 115exit 1 116