質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Contentful

Contentfulは、グラフィカルなUIを提供しないAPIベースのヘッドレスCMSです。従来のCMSと異なり、ディスクトップやモバイルを始めとするさまざまなプラットフォームへのコンテンツ配信が可能なAPIが用意されています。

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

TeX

フリーの組版システムで、字や図版などの要素を紙面に配置するという作業をコンピュータで行います

Q&A

解決済

1回答

1374閲覧

Gatsby+Contentful+KaTeXで数式がうまく表示できない

AkihiroIshii

総合スコア67

Contentful

Contentfulは、グラフィカルなUIを提供しないAPIベースのヘッドレスCMSです。従来のCMSと異なり、ディスクトップやモバイルを始めとするさまざまなプラットフォームへのコンテンツ配信が可能なAPIが用意されています。

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

TeX

フリーの組版システムで、字や図版などの要素を紙面に配置するという作業をコンピュータで行います

0グッド

0クリップ

投稿2021/05/03 02:05

編集2021/05/08 23:42

やりたいこと

Contentful(CMS)のコンテンツを、マークダウン記法とKaTex記法を用いて執筆したいです。

困っていること

プラグインgatsby-remark-katexドキュメントを参考にコードを書き換えたのですが、うまく反映されません。

ネットで調べてmdxのプラグインを使う例なども見て試したりしましたが上手くいきません。ただ、Reactの知識もないので根本的なところで間違っている可能性もあります。そこで、後述のコードやプラグインで誤りや確認すべき点があれば、ご指摘いただけると助かります。

環境

  • Gatsby 3.3.0
  • gatsby-transformer-remark 4.1.0
  • gatsby-remark-katex 5.1.0
  • CMS:Contentful(ブログコンテンツは、Long text の Markdown に設定)
  • 確認用のブラウザ:Google Chrome

コード

gatsby-config.js, gatsby-blowser.js, ブログ記事テンプレートファイル(.js)の内容は以下の通りです。

gatsby-config.js

javascript

1module.exports = { 2 siteMetadata: { 3 // *****(中略)***** 4 }, 5 plugins: [ 6 // *****(中略)***** 7 { 8 resolve: `gatsby-transformer-remark`, 9 options: { 10 commonmark: true, 11 footnotes: true, 12 pedantic: true, 13 gfm: true, 14 plugins: [ 15 // *****(中略)***** 16 { 17 resolve: `gatsby-remark-katex`, 18 options: { 19 // Add any KaTeX options from https://github.com/KaTeX/KaTeX/blob/master/docs/options.md here 20 strict: `ignore` 21 } 22 } 23 ], 24 }, 25 }, 26 `gatsby-plugin-sass`, 27 ], 28};

gatsby-blowser.js

javascript

1require(`katex/dist/katex.min.css`)

src/templates/blogpost-template.js(ブログ記事のテンプレートファイル)

javascript

1import React from "react" 2import { graphql, Link } from "gatsby" 3 4import Layout from "../components/layout" 5 6// *****(中略)***** 7 8export default function Blogpost ({ data, pageContext, location }) { 9 const { contentfulBlogPost: post } = data 10 return ( 11 <Layout> 12 // *****(中略)***** 13 <div className="postbody" 14 dangerouslySetInnerHTML={{ __html: post.content.childMarkdownRemark.html }} 15 /> 16 // *****(中略)***** 17 </Layout> 18 ) 19} 20 21export const query = graphql` 22 query($id: String!) { 23 contentfulBlogPost(id: { eq: $id }) { 24 title 25 slug 26 publishDate 27 publishDateJP: publishDate(formatString: "YYYY/MM/DD") 28 updatedAt 29 updatedAtJP: updatedAt(formatString: "YYYY/MM/DD") 30 category { 31 category 32 categorySlug 33 } 34 content { 35 childMarkdownRemark { 36 html 37 } 38 } 39 } 40 } 41`

(5/5追記)気になること

Google Chromeのデベロッパーツールで確認すると、$$で囲った箇所にはclass="math math-display"が、$で囲った箇所にはclass="math math-inline"が付与されていました。

イメージ説明

しかし、node_modulesディレクトリにあるkatex/dist/katex.min.css内を検索しても、math-displaymath-inlineのクラスに関する記述は見当たりませんでした。

修正箇所

  • (5/9)ファイル名に誤りがあったので手元の環境で修正しました。

誤:gatsby-blowser.js
正:gatsby-browser.js

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

gatsby-remark-katexのバージョンがv5.0.0以上、もしくはgatsby-transformer-remarkのバージョンがv4.0.0以上の場合は問題が生じるようです。

(参考1)Githubのissue:upgrading to gatsby-remark-katex v5.0.0 and/or gatsby-transformer-remark v4.0.0 breaks katex math equation #30865
(参考2)Qiitaの記事:新卒プログラマーがGatsbyで個人サイト兼ブログを作ってみた

ただ、上述の記事を参考にして試しても手元の環境ではうまくいかず、こちらを参考にCDNでkatexを読み込むことにしました。

また、ページ遷移時は数式がレンダリングされず、リロードする必要があります。このような問題は残っていますが、ひとまずkatexの数式表示が反映されることは確認できたので、この質問はクローズにします。

なお、コーディング内容は次の通りです。

src/pages/index.js

javascript

1import React from "react" 2import Layout from "../components/layout" 3import Seo from "../components/seo" 4 5export default function Index ({ data }) { 6 return ( 7 <Layout> 8 <Seo /> 9 <div> 10 $y = x^2$ 11 </div> 12 </Layout> 13 ) 14}

src/components/layout.js

javascript

1import React from "react" 2import Header from "../components/header" 3import Footer from "../components/footer" 4import "./layout.scss" 5 6export default function Layout ({ children }) { 7 return ( 8 <div> 9 <Header /> 10 11 <div className="main-wrapper"> 12 {children} 13 </div> 14 15 <Footer /> 16 </div> 17 ) 18}

src/components/seo.js

javascript

1import React from "react" 2import { Helmet } from "react-helmet" 3import { useStaticQuery, graphql } from "gatsby" 4 5export default function Seo ( props ) { 6 // *****(中略)***** 7 return ( 8 <Helmet> 9 // *****(中略)***** 10 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.css" integrity="sha384-Um5gpz1odJg5Z4HAmzPtgZKdTBHZdw8S29IecapCSB31ligYPhHQZMIlWLYQGVoc" crossorigin="anonymous" /> 11 <script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.js" integrity="sha384-YNHdsYkH6gMx9y3mRkmcJ2mFUjTd0qNQQvY9VYZgQd7DcN7env35GzlmFaZ23JGp" crossorigin="anonymous"></script> 12 <script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/contrib/auto-render.min.js" integrity="sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl" crossorigin="anonymous" 13 onload="renderMathInElement(document.body, { 14 delimiters: [ 15 {left: '$$', right: '$$', display: true}, 16 {left: '$', right: '$', display: false}, 17 {left: '\(', right: '\)', display: false}, 18 {left: '\[', right: '\]', display: true} 19 ], 20 });"> 21 </script> 22 23 // *****(中略)***** 24 </Helmet> 25 ) 26}

投稿2021/05/22 21:50

AkihiroIshii

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問