Title: [Bug]: Can not fallback to `kpsewhich` when `luatex` does not work · Issue #31983 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: Can not fallback to `kpsewhich` when `luatex` does not work · Issue #31983 · matplotlib/matplotlib
X Title: [Bug]: Can not fallback to `kpsewhich` when `luatex` does not work · Issue #31983 · matplotlib/matplotlib
Description: Bug summary Hi, I found that the function find_tex_file in dviread.py can not fallback to using kpsewhich when luatex does not work. I think the problem is caused by the fact that my glibc is too old, i.e., when I run luatex --luaonly, I...
Open Graph Description: Bug summary Hi, I found that the function find_tex_file in dviread.py can not fallback to using kpsewhich when luatex does not work. I think the problem is caused by the fact that my glibc is too o...
X Description: Bug summary Hi, I found that the function find_tex_file in dviread.py can not fallback to using kpsewhich when luatex does not work. I think the problem is caused by the fact that my glibc is too o...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/31983
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: Can not fallback to `kpsewhich` when `luatex` does not work","articleBody":"### Bug summary\n\nHi, I found that the function `find_tex_file` in `dviread.py` can not fallback to using `kpsewhich` when `luatex` does not work. I think the problem is caused by the fact that my `glibc` is too old, _i.e._, when I run `luatex --luaonly`, I get:\n\n```bash\nluatex: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by luatex)\n```\n\nLaTeX version: pdfTeX 3.141592653-2.6-1.40.29 (TeX Live 2026)\n\n### Code for reproduction\n\n```Python\n## matplotlib\nimport matplotlib\nmatplotlib.use('Agg')\nmatplotlib.rcParams['text.latex.preamble'] = r'\\usepackage{amsmath}';\nmatplotlib.rc('text', usetex = True)\nfrom matplotlib import pyplot as py\n\nxs = [1.0, 2.0, 3.0]\nys = [1.0, 2.0, 3.0]\naxs = [py.subplot(1, 1, 1)]\naxs[0].plot(xs, ys, color = 'dodgerblue')\nx_label = r'$\\Delta, \\Theta, \\Xi, \\Pi, \\Sigma, \\Upsilon, \\Phi, \\Psi, \\Omega, \\Gamma$'\ny_label = r'$\\delta, \\theta, \\xi, \\pi, \\sigma, \\upsilon, \\phi, \\psi, \\omega, \\gamma$'\naxs[0].set_xlabel(x_label, size = 20)\naxs[0].set_ylabel(y_label, size = 20)\npy.tight_layout()\nname = './test.pdf'\npy.savefig(name)\npy.close()\n```\n\n### Actual outcome\n\n```bash\nTraceback (most recent call last):\n File \"/public/home/zhouyy/test/test.py\", line 16, in \u003cmodule\u003e\n py.tight_layout()\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/pyplot.py\", line 2992, in tight_layout\n gcf().tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/figure.py\", line 3665, in tight_layout\n engine.execute(self)\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/layout_engine.py\", line 188, in execute\n kwargs = get_tight_layout_figure(\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/_tight_layout.py\", line 266, in get_tight_layout_figure\n kwargs = _auto_adjust_subplotpars(fig, renderer,\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/_tight_layout.py\", line 82, in _auto_adjust_subplotpars\n bb += [martist._get_tightbbox_for_layout_only(ax, renderer)]\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/artist.py\", line 1485, in _get_tightbbox_for_layout_only\n return obj.get_tightbbox(*args, **{**kwargs, \"for_layout_only\": True})\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/axes/_base.py\", line 4740, in get_tightbbox\n ba = martist._get_tightbbox_for_layout_only(axis, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/artist.py\", line 1485, in _get_tightbbox_for_layout_only\n return obj.get_tightbbox(*args, **{**kwargs, \"for_layout_only\": True})\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/axis.py\", line 1427, in get_tightbbox\n self._update_label_position(renderer)\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/axis.py\", line 2615, in _update_label_position\n bboxes, bboxes2 = self._get_tick_boxes_siblings(renderer=renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/axis.py\", line 2403, in _get_tick_boxes_siblings\n tlb, tlb2 = axis._get_ticklabel_bboxes(ticks_to_draw, renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/axis.py\", line 1404, in _get_ticklabel_bboxes\n return ([tick.label1.get_window_extent(renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/text.py\", line 1076, in get_window_extent\n bbox, _, _ = self._get_layout(self._renderer)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/text.py\", line 465, in _get_layout\n _, h, min_descent = _get_text_metrics_with_cache(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/text.py\", line 59, in _get_text_metrics_with_cache\n return get_text_metrics(text, fontprop.copy(), ismath, dpi)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/text.py\", line 125, in _text_metrics\n return local_renderer.get_text_width_height_descent(text, fontprop, ismath)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/backends/backend_agg.py\", line 256, in get_text_width_height_descent\n return super().get_text_width_height_descent(s, prop, ismath)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/backend_bases.py\", line 589, in get_text_width_height_descent\n return self.get_texmanager().get_text_width_height_descent(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/texmanager.py\", line 372, in get_text_width_height_descent\n page, = dvi\n ^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/dviread.py\", line 278, in __iter__\n while self._read():\n ^^^^^^^^^^^^\n File \"/public/home/zhouyy/packages/miniforge3/lib/python3.12/site-packages/matplotlib/dviread.py\", line 360, in _read\n raise self._missing_font.to_exception()\nFileNotFoundError: Matplotlib's TeX implementation searched for a file named 'cmss10.tfm' in your texmf tree, but could not find it\n```\n\n### Expected outcome\n\nThe expected outcome can be achieved by commenting out the following lines and manually set `lk` to `None` in function `find_tex_file` in `dviread.py`:\n\n```python\n # try:\n # lk = _LuatexKpsewhich()\n # except (FileNotFoundError, OSError):\n # lk = None # Fallback to directly calling kpsewhich, as below.\n lk = None\n```\n\nBut this has caused a further issue: `\\Gamma` (and only `\\Gamma`, see the _x_-axis label) can not be rendered properly.\n\n[test.pdf](https://github.com/user-attachments/files/29592070/test.pdf)\n\n### Additional information\n\n_No response_\n\n### Operating system\n\nLinux 3.10.0-1160.el7.x86_64\n\n### Matplotlib Version\n\n3.11.0\n\n### Matplotlib Backend\n\nAgg\n\n### Python version\n\n3.12.12\n\n### Jupyter version\n\n_No response_\n\n### Installation\n\npip","author":{"url":"https://github.com/zhyiyu","@type":"Person","name":"zhyiyu"},"datePublished":"2026-07-02T09:52:41.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/31983/matplotlib/issues/31983"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:0ce249e0-52a2-60d8-58fd-598d6e943678 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B212:1CDD30:14C196D:1C16DC2:6A546148 |
| html-safe-nonce | 4b4e1f45133c4dd4207a93f6c8be8c1b9427ac35912d071f8a0cfab229efd602 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMjEyOjFDREQzMDoxNEMxOTZEOjFDMTZEQzI6NkE1NDYxNDgiLCJ2aXNpdG9yX2lkIjoiNjE4MTEwNzMzNTQ4ODEwMjcyOSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1f7c14d6e19104a131ce152cf0ce785e4ccd072a2032a2daa8b451fba66f4e19 |
| hovercard-subject-tag | issue:4793267561 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/31983/issue_layout |
| twitter:image | https://opengraph.githubassets.com/48455b5d4b374b9234700557d385aeda96f3e3da179db967a5fedfa844de0a40/matplotlib/matplotlib/issues/31983 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/48455b5d4b374b9234700557d385aeda96f3e3da179db967a5fedfa844de0a40/matplotlib/matplotlib/issues/31983 |
| og:image:alt | Bug summary Hi, I found that the function find_tex_file in dviread.py can not fallback to using kpsewhich when luatex does not work. I think the problem is caused by the fact that my glibc is too o... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | zhyiyu |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 6d28624802c2f7d9500239dd6870ed7031b7353b |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width