check-variable-fonts.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. # Default per-user fontconfig path (overridden by env variable)
  90. : ${FONTS_CONF_DENY_VF:=$HOME/deny-vf}
  91. export XDG_CONFIG_HOME=${FONTS_CONF_DENY_VF}
  92. notocjkvffonts=`fc-list : file family variable | \
  93. grep 'variable=True' | \
  94. grep -E -e 'Noto (Sans|Sans Mono|Serif) CJK' | \
  95. sed -e 's/^/ /' -e 's/: Noto S.*$//' | sort | uniq`
  96. if [ "x$notocjkvffonts" != "x" ] ; then
  97. echo '============================================================================='
  98. echo 'XeTeX is confused by "variable font" files listed below:'
  99. echo "$notocjkvffonts"
  100. echo
  101. echo 'For CJK pages in PDF, they need to be hidden from XeTeX by denylisting.'
  102. echo 'Or, CJK pages can be skipped by uninstalling texlive-xecjk.'
  103. echo
  104. echo 'For more info on denylisting, other options, and variable font, see header'
  105. echo 'comments of scripts/check-variable-fonts.sh.'
  106. echo '============================================================================='
  107. fi
  108. # As this script is invoked from Makefile's error path, always error exit
  109. # regardless of whether any variable font is discovered or not.
  110. exit 1