達而録

ある中国古典研究者が忘れたくないことを書くブログ。毎週火曜日更新。

長い文章をそのままスライドに分けて落とし込む方法

 人文系の分野の学会発表は、ざっくり言って「紙媒体のレジュメ」をベースにする形式か、「スライドショー」をベースにする形式か、に分けられると思います。また、両者のいいところを掛け合わせて、「発表はスライドショーで進めつつ、詳しい資料としてレジュメを配布する」形式もよく見かけます。

 私の専攻である中国古典分野は、紙媒体ベースの場合が多いイメージがありますが、最近はスライドショーをつける場合も増えているように思います。スライドショーがあると、オンライン配信で見る時に見やすいというのも大きなメリットです。

 

 さて、図や画像がメインになるスライドならまだしも、文章メインのスライドを作るのは、元々の原稿がある所に、これをスライドごとに切り取って貼り付けて、切り取って貼り付けて……という作業が必要になり、非常に面倒です。

 そこで、まとまった文章を、マークダウン形式で見出し語+内容に書き直せば、そのままスライドに落とし込めるコードを生成AIを利用して作ったので、それを共有しておきます。

 なお、私はパワーポイントのソフトを持っていないので、google スライドで編集する方法になります(googleのアカウントを持っていれば誰でも無料で使えます。)

 

①まず、google スライドの編集画面から、App Scriptに飛びます。

 

②すると、以下の画面になります。この「function……」と書いてあるところを全部消去して、この記事の下部に貼ってあるコードを貼り付けます。

 

③「▶実行」をクリックします。実行ログが以下のように出れば成功です。

 

④初めて使う場合、以下のような警告が出るかもしれませんが、「詳細を表示」→「無題のプロジェクト(安全ではないページに移動)」→「続行」をクリックします。

⑤すると、こんな感じで、「見出し語+本文」の形で、スライドが作成されます。

 

⑥文字サイズやフォントは既定値になっていますので、文字数や好みに応じて変更する必要があります。しかし一枚一枚直すのは面倒です。そこで、「スライド」>「テーマを編集」から編集しましょう。

 

⑦「タイトルと本文」のところを編集し、文字のフォントやサイズ、行間などを一括で変更できます。もちろんテーマ自体を変更することも可能です。

 

⑧こんな感じになります。これで、一番面倒な各スライドへの切り貼りは終わった状態になります。ここからは、個別に微調整を加えていけばいいでしょう。

 

 以下が、App Scriptに貼り付けるコードです。

 4行目の「#スライド①」~「読解することに努めた。」の部分を、自分の原稿に置き換えてください。その際、見出し語にしたい部分は行頭に「#」をつけます。


    function createSlidesFromMarkdown() {

  const markdown = `
# スライド①

テーマ
後漢~唐代の経学史
特に経書解釈のロジックに着目する

# スライド②

第一章~第三章前半:鄭玄の経書解釈
第三章後半・第四章:南北朝経学と鄭説の関わり
第五章・第六章:他の南北朝経学
第七章:「五経正義」の編纂を扱う。

# スライド③

前提と先行研究の整理
特に、鄭玄の経書注釈に対する先行研究が、鄭説の中に当時の社会背景や政治的意図を読み込む傾向にあり、枠組み先行の議論に陥りかねないことを指摘した。
そこで本論文では、鄭玄や南北朝時代の学者の学説を、できるだけ学者自身の意図に沿って、その細やかな工夫を読解することに努めた。

`;

  const presentation = SlidesApp.getActivePresentation();
  const lines = markdown.split("\n");

  let currentSlide = null;
  let bodyLines = [];

  function addSlide(title, level) {

    currentSlide = presentation.appendSlide(
      SlidesApp.PredefinedLayout.TITLE_AND_BODY
    );

    const titleShape = currentSlide
      .getPlaceholder(SlidesApp.PlaceholderType.TITLE)
      .asShape();

    titleShape.getText().setText(title);

    bodyLines = [];
  }

  function flushBody() {
    if (!currentSlide) return;

    const bodyShape = currentSlide
      .getPlaceholder(SlidesApp.PlaceholderType.BODY)
      .asShape();

    bodyShape.getText().setText(bodyLines.join("\n"));
  }

  lines.forEach(line => {

    const h1 = line.match(/^# (.*)/);
    const h2 = line.match(/^## (.*)/);
    const h3 = line.match(/^### (.*)/);

    if (h1 || h2 || h3) {
      flushBody();

      const title = (h1 || h2 || h3)[1];
      const level = h1 ? 1 : h2 ? 2 : 3;

      addSlide(title, level);

    } else {
      bodyLines.push(line);
    }

  });

  flushBody();
}

  

(棋客)