<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>英検 &#8211; 文系ラボ</title>
	<atom:link href="https://lawcityblog.com/category/%e8%8b%b1%e6%a4%9c/feed/" rel="self" type="application/rss+xml" />
	<link>https://lawcityblog.com</link>
	<description>中学・高校・大学受験の文系学習サイト</description>
	<lastBuildDate>Thu, 05 Nov 2026 11:42:40 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://lawcityblog.com/wp-content/uploads/2026/10/bunkei-lab-favicon-300x300.png</url>
	<title>英検 &#8211; 文系ラボ</title>
	<link>https://lawcityblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://lawcityblog.com/category/%e8%8b%b1%e6%a4%9c/feed/"/>
	<item>
		<title>英検®は独学で間に合う？過去問1回分でわかる判定法と級別の勉強法【3級〜準1級】</title>
		<link>https://lawcityblog.com/eiken-dokugaku/</link>
					<comments>https://lawcityblog.com/eiken-dokugaku/#respond</comments>
		
		<dc:creator><![CDATA[Mino]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 04:51:14 +0000</pubDate>
				<category><![CDATA[オンラインスクール]]></category>
		<category><![CDATA[中学生活]]></category>
		<category><![CDATA[塾選び]]></category>
		<category><![CDATA[英検]]></category>
		<category><![CDATA[英語]]></category>
		<category><![CDATA[高校生活]]></category>
		<category><![CDATA[オンライン塾]]></category>
		<category><![CDATA[独学]]></category>
		<category><![CDATA[英検ライティング]]></category>
		<category><![CDATA[過去問]]></category>
		<guid isPermaLink="false">https://lawcityblog.com/?p=6666</guid>

					<description><![CDATA[<p><img src="https://lawcityblog.com/wp-content/uploads/2026/10/Gemini_Generated_Image_p2sp98p2sp98p2sp.jpeg" class="webfeedsFeaturedVisual" /></p>英検®3級〜準1級は独学で間に合う？級と残り期間で判断する早見表、2題になったライティングを無料ツールで点検する方法、英検専門のオンライン塾4つの料金と選び方を塾講師がまとめました。保護者向けの補足つき。]]></description>
										<content:encoded><![CDATA[<p><img src="https://lawcityblog.com/wp-content/uploads/2026/10/Gemini_Generated_Image_p2sp98p2sp98p2sp.jpeg" class="webfeedsFeaturedVisual" /></p><div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://lawcityblog.com/wp-content/uploads/2021/12/n0400.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2021/12/n0400.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">生徒</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>英検®2級を次の回で受けたいけど、塾に行かないと間に合わないのかな。ライティングも、何をどう書けばいいのか分からない…。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<p class="wp-block-paragraph">塾講師として中高生の英語を見てきた中で、英検の申し込みの前によくこのような悩みを聞きます。</p>



<p class="is-style-balloon_box wp-block-paragraph"><strong>結論</strong></p>



<p class="has-border -border04 wp-block-paragraph">3級から2級までは、級に合った単語帳と過去問があれば、独学で間に合う人が多いです。<span class="swl-marker mark_yellow"><strong>つまずきやすいのは、自分では採点できないライティングと面接です。</strong></span>この2つを無料ツールやAI、必要に応じてオンライン塾で補えば、むだなく進められます。</p>



<p class="is-style-balloon_box wp-block-paragraph">この記事でわかること</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>級と残り期間から、独学で間に合うかを判断する早見表</li>



<li>試験の申込期間と試験日</li>



<li>2024年度から2題になったライティングの対策と、無料で点検する方法</li>



<li>英検専門のオンライン塾4つの料金と選び方（2026年10月に公式サイトで確認）</li>
</ul>



<div class="swell-block-button blue_ is-style-btn_solid"><a href="#hikaku" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>英検対策のオンライン塾の比較を見る</span></a></div>



<h2 id="ketsuron" class="wp-block-heading">3級〜2級は独学で間に合いやすい 準1級と直前の挑戦は工夫が必要</h2>



<p class="has-border -border04 wp-block-paragraph">独学で間に合うかどうかは、受ける級と、試験までの残り期間でおおよそ決まります。下の表は、1つ下の級に合格している人を想定した目安です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>級（レベルの目安）</th><th>残り3か月以上</th><th>残り2か月以内</th></tr></thead><tbody><tr><th>3級<br>（中学卒業程度）</th><td>独学で十分</td><td>独学で間に合う。Eメール問題と面接の型を先に覚える</td></tr><tr><th>準2級<br>（高校中級程度）</th><td>独学で十分</td><td>独学で間に合う。ライティングを点検する手段を先に決める</td></tr><tr><th>準2級プラス<br>（高校上級程度）</th><td>独学で間に合う</td><td>単語が足りないと厳しい。単語帳とライティングを優先する</td></tr><tr><th>2級<br>（高校卒業程度）</th><td>独学で間に合う。要約と意見論述は、ときどき人に見てもらう</td><td>過去問の正答率が5割未満なら、外部の力を借りるか次の回に回す</td></tr><tr><th>準1級<br>（大学中級程度）</th><td>語彙を固め、ライティングの添削を受ければ独学でも目指せる</td><td>2級の合格から間がない場合は厳しい。次の回に回すことも考える</td></tr></tbody></table><figcaption class="wp-element-caption">級と残り期間で見る「独学で間に合うか」の早見表</figcaption></figure>



<p class="has-small-font-size wp-block-paragraph">※レベルの目安は英検協会の各級の説明によります。独学で間に合うかは塾講師としての指導経験にもとづく目安で、合格を約束するものではありません。</p>



<p class="wp-block-paragraph">表で「間に合う」となっていても、ライティングと面接だけは自分で採点できません。この2つをどう点検するかを先に決めておくと、独学でも迷わずに進められます。</p>



<p class="is-style-icon_info wp-block-paragraph"><strong>保護者の方へ</strong><br>この記事で紹介する英検専門のオンライン塾は、月4回でおよそ2万〜4万円（税込）かかります。まず本人が独学で過去問を1回分解き、その結果を見てから塾を考える順番で、十分に間に合います。</p>



<h2 id="nittei" class="wp-block-heading">試験の実際の例（申込期間や試験の日程・料金）</h2>



<p class="wp-block-paragraph">英検（従来型）は年に3回あります。例えば、2026年度の第3回の個人で申し込む場合の日程は次のとおりです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>日程・金額</th></tr></thead><tbody><tr><th>申込期間</th><td>2026年10月30日（金）〜12月14日（月）</td></tr><tr><th>一次試験</th><td>2027年1月24日（日）</td></tr><tr><th>一次の合否（ウェブ）</th><td>2027年2月15日（月）</td></tr><tr><th>二次試験</th><td>A日程：2月28日（日）／B日程：3月7日（日）</td></tr><tr><th>検定料（税込）</th><td>3級6,800円／準2級8,400円／準2級プラス8,600円／2級9,000円／準1級10,400円</td></tr></tbody></table><figcaption class="wp-element-caption">2026年度第3回の日程（個人申込・本会場）</figcaption></figure>



<p class="wp-block-paragraph">学校や塾でまとめて申し込む団体受験は、日程が異なります。学校で受ける人は、英語の先生に日程を確かめてください。</p>



<p class="wp-block-paragraph">従来型の日程が合わない人は、英検S-CBTも選べます。コンピューターで受ける形式で、原則として毎週土日に全国のテストセンターで実施されています（準1級・2級・準2級プラス・準2級・3級）。</p>



<h2 id="handan" class="wp-block-heading">独学で間に合うかは過去問1回分で判断できる</h2>



<p class="wp-block-paragraph">早見表は、あくまで目安です。自分の現在地を知るいちばん確かな方法は、受ける級の過去問を1回分、時間を計って解くことです。</p>



<p class="wp-block-paragraph">英検協会は、2級以下は各技能の正答率が6割程度、準1級は7割程度の受験者の多くが合格した、と公表しています（2016年度第1回一次試験のデータ）。この数字を、独学で間に合うかを判断する目安として使います。</p>



<p class="is-style-balloon_box wp-block-paragraph">過去問1回分を解いたときの、リーディングとリスニングの正答率は？</p>



<ul class="wp-block-list -list-under-dashed">
<li><strong>6割以上（準1級は7割以上）</strong><br>→ 独学で十分です。ライティングと面接の練習に時間を回してください。</li>



<li><strong>5〜6割</strong><br>→ 独学で間に合います。単語帳を1周してから、過去問を週に1回分ずつ解きます。</li>



<li><strong>5割未満で、残り2か月以内</strong><br>→ 外部の力を借りるか、次の回に回すことも考えます（<a href="#hikaku">オンライン塾の比較</a>）。</li>
</ul>



<p class="is-style-bg_grid has-border -border03 wp-block-paragraph">もう1つ知っておきたいのが、英検の点数のしくみです。英検CSEスコアは、問題の数に関係なく、技能ごとに同じ点数が配分されています。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="436" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-110.png" alt="英検CSEスコア" class="wp-image-7889" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-110.png 780w, https://lawcityblog.com/wp-content/uploads/2026/10/image-110-300x167.png 300w, https://lawcityblog.com/wp-content/uploads/2026/10/image-110-499x279.png 499w, https://lawcityblog.com/wp-content/uploads/2026/10/image-110-768x429.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<!-- FIGURE: 図2：問題数は違っても、技能ごとの配点は同じ（figures.md 参照） -->



<p class="wp-block-paragraph">たとえば2級の一次試験では、リーディングが31問あるのに対して、ライティングは2題しかありません。それでも満点はどちらも650点なので、ライティング1題の重みはとても大きくなります。</p>



<h2 id="keishiki" class="wp-block-heading">2024年度から、ライティングは2題に変更</h2>



<p class="wp-block-paragraph">2024年度第1回から、3級以上の級で問題の形式が変わりました。いちばん大きな変化は、<strong><span class="swl-marker mark_yellow">ライティングが1題から2題に増えたこと</span></strong>です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>級</th><th>1題目（新しく加わった問題）</th><th>2題目（意見論述）</th></tr></thead><tbody><tr><th>3級</th><td>Eメールへの返信（15〜25語）</td><td>意見と理由2つ（25〜35語）</td></tr><tr><th>準2級</th><td>Eメールへの返信（40〜50語）</td><td>意見と理由2つ（50〜60語）</td></tr><tr><th>2級</th><td>英文の要約（45〜55語）</td><td>意見と理由2つ（80〜100語）</td></tr><tr><th>準1級</th><td>英文の要約（60〜70語）</td><td>意見論述（120〜150語）</td></tr></tbody></table><figcaption class="wp-element-caption">級ごとのライティングの問題（語数は目安）</figcaption></figure>



<p class="has-small-font-size wp-block-paragraph">※形式は英検協会の「問題形式リニューアル」のページ、語数は英検協会が公開している過去問で確認（2026年10月）。2025年度に新しくできた準2級プラスの形式は、英検協会の「準2級プラスの過去問・試験内容」のページで確かめてください。</p>



<p class="wp-block-paragraph">ライティングが増えた代わりに、準2級から1級では語彙や長文の問題が減りました。試験時間は、準2級が75分から80分に、3級が50分から65分に延びています。</p>



<p class="wp-block-paragraph">要約問題は、英文の要点をつかみ、自分の言葉で短くまとめる力を見る問題です。本文の文をつなぎ合わせるだけでは要約にならないので、言い換えの練習が欠かせません。</p>



<h2 id="susumekata" class="wp-block-heading">独学の進め方は「単語→過去問→ライティング→面接」</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="436" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-111.png" alt="独学の進め方は「単語→過去問→ライティング→面接」" class="wp-image-7890" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-111.png 780w, https://lawcityblog.com/wp-content/uploads/2026/10/image-111-300x167.png 300w, https://lawcityblog.com/wp-content/uploads/2026/10/image-111-768x429.png 768w, https://lawcityblog.com/wp-content/uploads/2026/10/image-111-499x279.png 499w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<!-- FIGURE: 図3：独学の進め方（単語→過去問→ライティング→面接）（figures.md 参照） -->



<ol class="wp-block-list is-style-num_circle">
<li><strong>単語</strong>：級に合った単語帳を1冊に決め、1周する</li>



<li><strong>過去問</strong>：時間を計って解き、間違えた問題を見直す</li>



<li><span class="swl-marker mark_yellow"><strong>ライティング</strong>：型を覚え、書いたら必ず点検する</span></li>



<li><strong>面接</strong>：音読と、質問に答える練習をする（本格的な練習は一次の後でも間に合う）</li>
</ol>



<p class="wp-block-paragraph">単語から始めるのは、単語が分からないと、どの技能の問題も解けないからです。慣れてきたら、単語帳と過去問を並行して進めて構いません。</p>



<h3 id="tango" class="wp-block-heading">単語：級に合った単語帳を1冊に決める</h3>



<p class="wp-block-paragraph">単語帳は何冊も買うより、<strong><span class="swl-marker mark_yellow">級に合った1冊を繰り返す</span></strong>ほうが身につきます。英検の単語帳は級ごとに出ているので、受ける級のものを選んでください。</p>



<p class="wp-block-paragraph">旺文社の『でる順パス単』シリーズの新しい版は、2026年7月に発売されました。書店や通販で買うときは、表紙の版の表記を確かめてください。</p>



<!-- POCHIPP: 書名『英検3級 でる順パス単』／出版社：旺文社／版：新装5訂版（2026年7月17日発売）／ISBN：9784010951224 -->



<!-- POCHIPP: 書名『英検準2級 でる順パス単』／出版社：旺文社／版：新装5訂版（2026年7月17日発売）／ISBN：9784010951217 -->



<!-- POCHIPP: 書名『英検準2級プラス対策 重要度順パス単』／出版社：旺文社／版：新装版（2026年7月17日発売）／ISBN：9784010951200 -->



<!-- POCHIPP: 書名『英検2級 でる順パス単』／出版社：旺文社／版：新装5訂版（2026年7月17日発売）／ISBN：9784010951194 -->



<!-- POCHIPP: 書名『英検準1級 でる順パス単』／出版社：旺文社／版：6訂版（2026年7月17日発売）／ISBN：9784010951187 -->



<p class="wp-block-paragraph">覚えたかどうかの確認には、文系ラボ（当サイト）の無料テストも使えます。3級なら中学英単語テスト1000問、準2級以上なら大学受験の英単語テスト1536問がレベルに合います。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0788-500x273.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/high-school-english-test/">【無料・高校受験】中学英単語テスト1000問 入試頻出単語を4択クイズで完全攻略</a>
											</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/Gemini_Generated_Image_41tsxg41tsxg41ts-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-test-maker/">【自動生成・無料】大学受験　英単語テスト1536語 ４択クイズで実力診断</a>
											</div>
				</div>
			</div>
		</div>


<h3 id="kakomon" class="wp-block-heading">過去問：1回分ずつ、時間を計って解く</h3>



<p class="wp-block-paragraph">リーディングとリスニングは、過去問で形式に慣れるのがいちばんの近道です。英検協会のサイトでも直近3回分の過去問と解答が公開されていますが、解説はついていません。</p>



<p class="wp-block-paragraph">解説が必要なら、市販の過去問集を1冊用意してください。旺文社の『過去6回全問題集』は、2026年10月の時点で2026年度版が最新です。</p>



<!-- POCHIPP: 書名『2026年度版 英検3級 過去6回全問題集』／出版社：旺文社／版：2026年度版（2026年2月26日発売）／ISBN：9784010951095 -->



<!-- POCHIPP: 書名『2026年度版 英検準2級 過去6回全問題集』／出版社：旺文社／版：2026年度版（2026年2月26日発売）／ISBN：9784010951088 -->



<!-- POCHIPP: 書名『2026年度版 英検準2級プラス 全問題集』／出版社：旺文社／版：2026年度版／ISBN：9784010951071 -->



<!-- POCHIPP: 書名『2026年度版 英検2級 過去6回全問題集』／出版社：旺文社／版：2026年度版（2026年2月26日発売）／ISBN：9784010951064 -->



<!-- POCHIPP: 書名『2026年度版 英検準1級 過去6回全問題集』／出版社：旺文社／版：2026年度版（2026年2月26日発売）／ISBN：9784010951057 -->



<p class="wp-block-paragraph">解き終わったら、正答率を技能ごとに書き出しておきます。どの技能が弱いかが分かれば、残りの時間の使い方が決まります。</p>



<h3 id="writing" class="wp-block-heading">ライティング：無料ツールで点検し、必要ならAIや人に見てもらう</h3>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="410" src="https://lawcityblog.com/wp-content/uploads/2023/02/1-12.jpg" alt="" class="wp-image-2316" srcset="https://lawcityblog.com/wp-content/uploads/2023/02/1-12.jpg 780w, https://lawcityblog.com/wp-content/uploads/2023/02/1-12-500x263.jpg 500w, https://lawcityblog.com/wp-content/uploads/2023/02/1-12-300x158.jpg 300w, https://lawcityblog.com/wp-content/uploads/2023/02/1-12-768x404.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<p class="wp-block-paragraph">ライティングは、独学でいちばん差がつく技能です。書いた答案が何点になるのかを、自分では判断できないからです。</p>



<p class="wp-block-paragraph">文系ラボでは、英検のライティングの練習に使える無料ツールを2つ用意しています。お題を出すツールと、書いた答案を点検するツールです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>やること</th><th>ツール</th><th>できること</th></tr></thead><tbody><tr><th>お題を出す</th><td><a href="https://lawcityblog.com/english-theme-maker/">英作文テーマメーカー</a></td><td>3級〜準1級の意見論述と、3級・準2級のEメール問題のお題を出せる。ヒントは4段階で、模範解答もある</td></tr><tr><th>答案を点検する</th><td><a href="https://lawcityblog.com/english-writing-checker/">英作文チェッカー</a></td><td>3級〜準1級の意見論述・Eメール・要約に対応。語数と、三単現のsの抜けなど51項目の基本的なミスを確かめられる（登録不要）</td></tr></tbody></table><figcaption class="wp-element-caption">ライティングの練習に使える文系ラボの無料ツール</figcaption></figure>



<p class="wp-block-paragraph">英作文チェッカーで分かるのは、語数や文法などの形式的なミスです。内容の説得力や、表現の自然さまでは判定しません。</p>



<p class="wp-block-paragraph">中身まで見てもらいたいときは、AIの採点か、人の添削を使います。費用を抑えたいなら、次に紹介するAIの採点から試すのが手軽です。</p>



<!-- NOTE: {{NOTE:英検ライティング答案テンプレート集}} を作ったら、この位置で「準備中の教材」として紹介する -->



<h4 id="svc-uguis" class="wp-block-heading">AIにすぐ採点してほしい：UGUIS.AI</h4>


	<div class="swell-block-review">
		<div class='swell-block-review__inner'>
							<div class='swell-block-review__title'>
					<span>UGUIS.AI</span>
				</div>
						<figure class="swell-block-review__image"><img decoding="async" class="__img wp-image-3205" src="https://lawcityblog.com/wp-content/uploads/2026/01/UGUISAI.png" alt="" width="600" height="600" srcset="https://lawcityblog.com/wp-content/uploads/2026/01/UGUISAI.png 600w, https://lawcityblog.com/wp-content/uploads/2026/01/UGUISAI-500x500.png 500w, https://lawcityblog.com/wp-content/uploads/2026/01/UGUISAI-300x300.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>										<div class='swell-block-review__merits'>
					<div class='__label'>メリット</div>
					<ul class='__list is-style-good_list'>
						<li>3級〜準1級のライティングに対応し、要約問題とEメール問題も練習できる</li><li>書いてすぐに、採点とフィードバックが返ってくる</li><li>無料会員でも、毎日もらえるポイントで使える</li><li>英検のスピーキングの練習もできる</li>					</ul>
				</div>
										<div class='swell-block-review__demerits'>
					<div class='__label'>デメリット</div>
					<ul class='__list is-style-bad_list'>
						<li>AIの採点は目安で、本番と同じ点になるとは限らない</li><li>無料会員は、ポイントの範囲でしか使えない</li><li>有料プランの料金は公式サイトで確かめられず、App Storeの表示で確認した</li>					</ul>
				</div>
					</div>
	</div>
	<script type="application/ld+json">{"@context":"https://schema.org","@graph": [{"@type":"Product","name":"UGUIS.AI","image":"https:\/\/lawcityblog.com\/wp-content\/uploads\/2026\/01\/UGUISAI.png","review":{"@type":"Review","positiveNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"3級〜準1級のライティングに対応し、要約問題とEメール問題も練習できる"},{"@type":"ListItem","position":2,"name":"書いてすぐに、採点とフィードバックが返ってくる"},{"@type":"ListItem","position":3,"name":"無料会員でも、毎日もらえるポイントで使える"},{"@type":"ListItem","position":4,"name":"英検のスピーキングの練習もできる"}]},"negativeNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"AIの採点は目安で、本番と同じ点になるとは限らない"},{"@type":"ListItem","position":2,"name":"無料会員は、ポイントの範囲でしか使えない"},{"@type":"ListItem","position":3,"name":"有料プランの料金は公式サイトで確かめられず、App Storeの表示で確認した"}]},"author":{"@type":"Person","name":"Mino"},"publisher":{"@id":"https:\/\/lawcityblog.com\/#organization"},"datePublished":"2026-10-31T13:51:14+0900"}}]}</script>


<p class="wp-block-paragraph">UGUIS.AIは、英検形式のライティングをAIが採点する学習アプリです（Web・iOS）。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>無料会員</th><td>初回登録で10ポイント。翌日からはログインすると毎日最大3ポイント</td></tr><tr><th>学び放題</th><td>1か月980円／3か月2,880円／6か月5,400円／12か月9,600円（App Storeの表示）</td></tr><tr><th>対応</th><td>英検5級〜準1級（ライティングは3級〜準1級）、大学入試の自由英作文</td></tr><tr><th>提供元</th><td>株式会社教育測定研究所</td></tr></tbody></table><figcaption class="wp-element-caption">料金と条件（2026年10月に確認・税込）</figcaption></figure>



<div class="pb-compare-box" data-colset="1"><div class="pb-compare-box__head"><div class="pb-compare-box__head__l">向いている人</div><div class="pb-compare-box__head__r">向いていない人</div></div>
<div class="pb-compare-box__body">
<div class="pb-compare-box__body__l">
<ul class="pb-list -icon-check -border-on">
<li>書く本数を増やし、そのたびに点数の目安を知りたい人。</li>
</ul>
</div>



<div class="pb-compare-box__body__r">
<ul class="pb-list -icon-check -border-on">
<li>1つの答案を、講師と話しながらじっくり直したい人。</li>
</ul>
</div>
</div>
</div>



<p class="wp-block-paragraph">画面の使い方や採点の例は、文系ラボの<a href="https://lawcityblog.com/uguis-ai/">UGUIS.AIのレビュー記事</a>で詳しく紹介しています。</p>



<div class="swell-block-button red_ is-style-btn_solid" data-id="7c62d245"><a href="https://t.felmat.net/r/5b4egzr?pb=" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>UGUIS.AIを無料会員で試してみる</span></a></div>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0778-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/uguis-ai/">【レビュー】添削が無限？話題のUGUIS.AIが英検・大学入試の英作文対策に最強な理由【限定クーポン付き】</a>
											</div>
				</div>
			</div>
		</div>


<h3 id="mensetsu" class="wp-block-heading">面接：本格的な練習は一次の後でも間に合う　音読は毎日する</h3>



<p class="wp-block-paragraph">二次試験の面接は、3級以上の級で行われます。問題カードの英文を音読し、英文や絵についての質問と、あなた自身の考えを聞く質問に答える形です。</p>



<p class="wp-block-paragraph">第3回の場合、一次の合否がウェブで分かるのは2月15日で、20歳以下の人が受けるB日程の二次試験は3月7日です。その間は3週間ほどしかありません。</p>



<p class="wp-block-paragraph">慌てないために、一次の勉強をしている間も、過去問の英文を毎日1回声に出して読んでおきましょう。それだけで、面接の音読と、英語を口から出す準備になります。</p>



<p class="is-style-icon_info wp-block-paragraph"><strong>保護者の方へ</strong><br>面接の練習相手は、英語が話せなくても務まります。過去問の質問文を読み上げて、答えが止まらずに出てくるかを見るだけでも、本番に近い練習になります。</p>



<h2 id="dokugaku" class="wp-block-heading">独学でできること・人に頼ったほうが早いこと</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>独学でできること</th><th>人に頼ったほうが早いこと</th></tr></thead><tbody><tr><td>単語を覚え、テストで確かめる</td><td>ライティングの中身（論理や説得力）の添削</td></tr><tr><td>過去問で形式に慣れ、正答率を測る</td><td>要約の言い換えが合っているかの確認</td></tr><tr><td>ライティングの型を覚え、語数とミスを点検する</td><td>面接で、その場で英語を返す練習</td></tr><tr><td>音読と、過去問の質問への答えの準備</td><td>残り期間が短いときの、計画の立て直し</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_orange">人に頼るべきなのは「書く」と「話す」のうち、自分では採点できない部分</span></strong>です。そこをどう補うかで、選ぶ手段が変わります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>補い方</th><th>費用の目安</th><th>向いている人</th></tr></thead><tbody><tr><th>学校の英語の先生</th><td>かからない</td><td>まず見てもらいたい人。何度も頼むのは難しいこともある</td></tr><tr><th>AIの採点</th><td>無料〜月980円（UGUIS.AIの場合）</td><td>書く本数を増やしたい人</td></tr><tr><th>英検専門のオンライン塾</th><td>月2万〜4万円ほど</td><td>書く・話すの両方を、1対1で見てほしい人</td></tr></tbody></table><figcaption class="wp-element-caption">書く・話すの補い方</figcaption></figure>



<p class="is-style-icon_announce wp-block-paragraph">最初に頼るのは、学校の英語の先生です。回数が足りないと感じたときに、AIやオンライン塾を足していけば、費用のむだを防げます。</p>



<h2 id="hikaku" class="wp-block-heading">英検専門のオンライン塾を使うなら：4つを比較</h2>



<p class="has-border -border04 wp-block-paragraph">書く・話すを1対1で見てほしい人や、残り期間が短い人には、英検対策に特化したオンライン塾が候補になります。ここでは、英検対策を専門にしている4つを比べます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>塾</th><th>対象</th><th>月額の目安</th><th>入会金</th><th>体験・相談</th></tr></thead><tbody><tr><th><a href="#svc-eironkai">英論会</a></th><td>中1〜高3（4級〜準1級）</td><td>週1回 30,250円（維持費込み）</td><td>16,500円</td><td>無料体験レッスン</td></tr><tr><th><a href="#svc-stasta">スタスタLIVE英検</a></th><td>小学生〜社会人</td><td>月4回（1回55分）20,000円〜</td><td>30,000円</td><td>無料カウンセリング（授業の体験ではない）</td></tr><tr><th><a href="#svc-samurai">さむらい英語塾</a></th><td>小学生〜社会人（5級〜準1級）</td><td>60分×月4回 37,400円</td><td>月謝コースは0円</td><td>500円の体験</td></tr><tr><th><a href="#svc-outcome">OUTCOME</a></th><td>中3〜高2</td><td>週2回 39,600円</td><td>33,000円</td><td>無料体験授業 2時間×3回</td></tr></tbody></table><figcaption class="wp-element-caption">英検専門のオンライン塾の比較（2026年10月時点・税込）</figcaption></figure>



<p class="has-small-font-size wp-block-paragraph">※料金は2026年10月に各社の公式サイトで確認しました。料金やキャンペーンは変わることがあるので、申し込む前に公式サイトで最新の情報を確かめてください。</p>



<p class="wp-block-paragraph">4つは、対象の学年と体験のしかたが大きく違います。まず、あなたの学年と受ける級で絞ってください。</p>



<p class="is-style-balloon_box wp-block-paragraph">あなたに合うのはどれ？</p>



<ul class="wp-block-list -list-under-dashed">
<li><strong>中高生で、担任の講師に週1回から見てほしい</strong><br>→ <a href="#svc-eironkai">英論会</a></li>



<li><strong>受ける級に合わせた料金で、月4回から始めたい</strong><br>→ <a href="#svc-stasta">スタスタLIVE英検</a></li>



<li><strong>試験の直前だけ、数回集中して見てほしい</strong><br>→ <a href="#svc-samurai">さむらい英語塾</a>（短期コース）</li>



<li><strong>中3〜高2で、英検と受験の英語を一緒に伸ばしたい</strong><br>→ <a href="#svc-outcome">OUTCOME</a></li>
</ul>



<p class="is-style-balloon_box wp-block-paragraph">体験や相談で聞くこと</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>担当の講師は誰か（英検の級や、指導の経験）</li>



<li>ライティングの添削は、授業の外でも見てもらえるか</li>



<li>面接の練習は、二次試験の前に何回できるか</li>



<li>入会金や教材費を含めて、受験までの総額はいくらか</li>



<li>途中でやめるときの条件と、返金の扱い</li>
</ul>



<p class="is-style-icon_good wp-block-paragraph">体験や相談には、自分で書いたライティングの答案を1本持っていくのがおすすめです。その答案をどう読み、どこを直すかを見れば、指導のしかたがよく分かります。</p>



<h3 id="svc-eironkai" class="wp-block-heading">中高生が、担任の講師に週1回から習いたい：英論会</h3>


	<div class="swell-block-review">
		<div class='swell-block-review__inner'>
							<div class='swell-block-review__title'>
					<span>英論会</span>
				</div>
						<figure class="swell-block-review__image"><img decoding="async" class="__img wp-image-7891" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-112.png" alt="" width="366" height="122" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-112.png 366w, https://lawcityblog.com/wp-content/uploads/2026/10/image-112-300x100.png 300w" sizes="(max-width: 366px) 100vw, 366px" /></figure>										<div class='swell-block-review__merits'>
					<div class='__label'>メリット</div>
					<ul class='__list is-style-good_list'>
						<li>中1〜高3が対象で、4級から準1級まで対応している</li><li>プロ講師の担任制で、1対1の指導を受けられる</li><li>二次試験の面接の直前対策講座がある</li><li>無料体験レッスンを受けられる</li>					</ul>
				</div>
										<div class='swell-block-review__demerits'>
					<div class='__label'>デメリット</div>
					<ul class='__list is-style-bad_list'>
						<li>1回の授業時間が、公式サイトで確認できない</li><li>「合格保証制度」は合格を保証するものではなく、条件つきで追加の授業が無料になる制度</li><li>小学生と、高校を卒業した人は対象外</li>					</ul>
				</div>
					</div>
	</div>
	<script type="application/ld+json">{"@context":"https://schema.org","@graph": [{"@type":"Product","name":"英論会","image":"https:\/\/lawcityblog.com\/wp-content\/uploads\/2026\/10\/image-112.png","review":{"@type":"Review","positiveNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"中1〜高3が対象で、4級から準1級まで対応している"},{"@type":"ListItem","position":2,"name":"プロ講師の担任制で、1対1の指導を受けられる"},{"@type":"ListItem","position":3,"name":"二次試験の面接の直前対策講座がある"},{"@type":"ListItem","position":4,"name":"無料体験レッスンを受けられる"}]},"negativeNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"1回の授業時間が、公式サイトで確認できない"},{"@type":"ListItem","position":2,"name":"「合格保証制度」は合格を保証するものではなく、条件つきで追加の授業が無料になる制度"},{"@type":"ListItem","position":3,"name":"小学生と、高校を卒業した人は対象外"}]},"author":{"@type":"Person","name":"Mino"},"publisher":{"@id":"https:\/\/lawcityblog.com\/#organization"},"datePublished":"2026-10-31T13:51:14+0900"}}]}</script>


<p class="wp-block-paragraph"><strong><a href="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2KA7JM+4NPS+BX3J6&amp;a8sns=etc" data-type="link" data-id="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2KA7JM+4NPS+BX3J6&amp;a8sns=etc">英論会</a></strong>は、<strong><span class="swl-marker mark_yellow">英検対策を専門にした、中高生向けのオンライン個別指導塾</span></strong>です。</p>



<p class="wp-block-paragraph">運営は、オンラインの数学塾「数強塾」を運営する株式会社数強塾です。指導はすべてオンラインの1対1で、全国から受けられます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>月額（維持費込み）</th><td>週1回30,250円／週2回42,350円／週3回54,450円</td></tr><tr><th>入塾金</th><td>16,500円（数強塾グループに在籍している人は不要）</td></tr><tr><th>体験</th><td>無料体験レッスンあり</td></tr><tr><th>合格保証制度</th><td>12コマ以上受講した人が一次試験に不合格だった場合、次の英検までの8コマの指導料が無料（適用は1回のみ）</td></tr></tbody></table><figcaption class="wp-element-caption">料金と条件（2026年10月時点・税込）</figcaption></figure>



<div class="pb-compare-box" data-colset="1"><div class="pb-compare-box__head"><div class="pb-compare-box__head__l">向いている人</div><div class="pb-compare-box__head__r">向いていない人</div></div>
<div class="pb-compare-box__body">
<div class="pb-compare-box__body__l">
<ul class="pb-list -icon-check -border-on">
<li>中高生で、同じ講師に続けて見てもらいたい人。</li>
</ul>
</div>



<div class="pb-compare-box__body__r">
<ul class="pb-list -icon-check -border-on">
<li>授業1回の長さまで比べてから決めたい人（体験の前に問い合わせが必要）。</li>
</ul>
</div>
</div>
</div>



<div class="swell-block-capbox cap_box is-style-small_ttl" data-colset="col3"><div class="cap_box_ttl" data-has-icon="1"><svg height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 48 48"><path d="M97.6 13.9c-.5-.7-.4-1.6.2-2l3.6-2.5c.6-.4 1.5-.2 1.9.5.5.7.4 1.6-.2 2l-3.6 2.5c-.6.4-1.5.2-1.9-.5zM100.7 22.4c-.1-.8.5-1.5 1.2-1.6l4.4-.4c.7-.1 1.4.6 1.4 1.4.1.8-.5 1.5-1.2 1.6l-4.4.4c-.7.1-1.4-.6-1.4-1.4zM90.6 8.1c-.7-.3-1.1-1.2-.8-1.8l1.8-4c.3-.6 1.2-.9 1.9-.6.7.3 1.1 1.2.8 1.8l-1.8 4c-.3.7-1.2.9-1.9.6zM40.9 28.7 24.2 4.9c-1.1-1.6-2.5-1.5-3-1.4-.7.2-2 .8-2.4 3.1-2.1 8-6.1 12.2-9.2 14.3l-6.4 4.5C1.7 26.4.8 28 .7 29.8c-.1 1.5.3 2.9 1.2 4.1 1.1 1.5 3 4.3 4 5.8.7 1 1.6 1.8 2.7 2.2.8.3 1.5.4 2.3.4 1.2 0 2.4-.4 3.4-1.1l3.9-2.8 4.4 6.2c.6.9 1.9 1.1 2.8.5L27 44c.9-.6 1.1-1.9.5-2.8l-4.2-6c3.2-1.6 7.8-2.8 14-2.2 2.4.4 3.4-.6 3.8-1.2.3-.3.9-1.5-.2-3.1zM21 32.1l-6.8-9.7c2.9-2.7 6.1-6.8 8-13.3l7 10 7 10c-6.7-.4-11.7 1.1-15.2 3zM42.7 12.2 38.6 15c-.7.5-1.6.3-2.1-.4s-.3-1.6.4-2.1L41 9.7c.7-.5 1.6-.3 2.1.4.5.6.3 1.6-.4 2.1zM33.9 3.7l-2.1 4.5c-.4.8-1.2 1.1-2 .7-.8-.4-1.1-1.2-.7-2l2.1-4.5c.4-.8 1.2-1.1 2-.7.8.4 1.1 1.3.7 2zM46.2 23.8l-5 .4c-.8.1-1.6-.5-1.6-1.4-.1-.8.5-1.6 1.4-1.6l5-.4c.8-.1 1.6.5 1.6 1.4 0 .8-.6 1.6-1.4 1.6z"></path></svg><span>体験で聞くこと</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">1回の授業時間と、月額に含まれる維持費の内訳を確認してください。</p>
</div></div>



<div class="swell-block-button red_ is-style-btn_solid" data-id="c6d81e80"><a href="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2KA7JM+4NPS+BX3J6&amp;a8sns=etc" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>英論会の無料体験レッスンを申し込む</span></a></div>



<h3 id="svc-stasta" class="wp-block-heading">受ける級に合わせた料金で、月4回から始めたい：スタスタLIVE英検</h3>


	<div class="swell-block-review">
		<div class='swell-block-review__inner'>
							<div class='swell-block-review__title'>
					<span>スタスタLIVE英検</span>
				</div>
						<figure class="swell-block-review__image"><img decoding="async" class="__img wp-image-7893" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-114.png" alt="" width="600" height="500" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-114.png 600w, https://lawcityblog.com/wp-content/uploads/2026/10/image-114-300x250.png 300w, https://lawcityblog.com/wp-content/uploads/2026/10/image-114-499x416.png 499w" sizes="(max-width: 600px) 100vw, 600px" /></figure>										<div class='swell-block-review__merits'>
					<div class='__label'>メリット</div>
					<ul class='__list is-style-good_list'>
						<li>1回55分で、月4回のコースから始められる</li><li>料金が級ごとに決まっていて、3級は月20,000円から</li><li>無料カウンセリングで、合格までのプランの提案書を受け取れる</li><li>講師は全員が英検準1級以上と、公式サイトに書かれている</li>					</ul>
				</div>
										<div class='swell-block-review__demerits'>
					<div class='__label'>デメリット</div>
					<ul class='__list is-style-bad_list'>
						<li>入会金が30,000円かかる</li><li>無料なのはカウンセリングで、授業そのものの無料体験はない</li><li>大学生や社会人も対象で、中高生専門ではない</li>					</ul>
				</div>
					</div>
	</div>
	<script type="application/ld+json">{"@context":"https://schema.org","@graph": [{"@type":"Product","name":"スタスタLIVE英検","image":"https:\/\/lawcityblog.com\/wp-content\/uploads\/2026\/10\/image-114.png","review":{"@type":"Review","positiveNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"1回55分で、月4回のコースから始められる"},{"@type":"ListItem","position":2,"name":"料金が級ごとに決まっていて、3級は月20,000円から"},{"@type":"ListItem","position":3,"name":"無料カウンセリングで、合格までのプランの提案書を受け取れる"},{"@type":"ListItem","position":4,"name":"講師は全員が英検準1級以上と、公式サイトに書かれている"}]},"negativeNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"入会金が30,000円かかる"},{"@type":"ListItem","position":2,"name":"無料なのはカウンセリングで、授業そのものの無料体験はない"},{"@type":"ListItem","position":3,"name":"大学生や社会人も対象で、中高生専門ではない"}]},"author":{"@type":"Person","name":"Mino"},"publisher":{"@id":"https:\/\/lawcityblog.com\/#organization"},"datePublished":"2026-10-31T13:51:14+0900"}}]}</script>


<p class="wp-block-paragraph"><strong><a href="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2OG8S2+5WXU+5YZ75&amp;a8sns=etc" data-type="link" data-id="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2OG8S2+5WXU+5YZ75&amp;a8sns=etc">スタスタLIVE英検</a></strong>は、<strong><span class="swl-marker mark_yellow">英検対策を専門にしたオンラインの1対1指導</span></strong>です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>月4回（1回55分）</th><td>3級以下20,000円〜／準2級22,000円〜／2級・準2級プラス24,000円〜／準1級30,000円〜</td></tr><tr><th>回数の多いコース</th><td>月6〜12回のコースもある（料金は級と回数で変わる）</td></tr><tr><th>入会金</th><td>30,000円（初月のみ）</td></tr><tr><th>無料カウンセリング</th><td>今の学習状況と目標を確かめ、合格プランの提案書を受け取れる</td></tr></tbody></table><figcaption class="wp-element-caption">料金と条件（2026年10月時点・税込）</figcaption></figure>



<div class="pb-compare-box" data-colset="1"><div class="pb-compare-box__head"><div class="pb-compare-box__head__l">向いている人</div><div class="pb-compare-box__head__r">向いていない人</div></div>
<div class="pb-compare-box__body">
<div class="pb-compare-box__body__l">
<ul class="pb-list -icon-check -border-on">
<li>受ける級が決まっていて、まず月4回で始めたい人。</li>
</ul>
</div>



<div class="pb-compare-box__body__r">
<ul class="pb-list -icon-check -border-on">
<li>申し込む前に、授業そのものを体験したい人。</li>
</ul>
</div>
</div>
</div>



<div class="swell-block-capbox cap_box is-style-small_ttl" data-colset="col3"><div class="cap_box_ttl" data-has-icon="1"><svg height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 48 48"><path d="M97.6 13.9c-.5-.7-.4-1.6.2-2l3.6-2.5c.6-.4 1.5-.2 1.9.5.5.7.4 1.6-.2 2l-3.6 2.5c-.6.4-1.5.2-1.9-.5zM100.7 22.4c-.1-.8.5-1.5 1.2-1.6l4.4-.4c.7-.1 1.4.6 1.4 1.4.1.8-.5 1.5-1.2 1.6l-4.4.4c-.7.1-1.4-.6-1.4-1.4zM90.6 8.1c-.7-.3-1.1-1.2-.8-1.8l1.8-4c.3-.6 1.2-.9 1.9-.6.7.3 1.1 1.2.8 1.8l-1.8 4c-.3.7-1.2.9-1.9.6zM40.9 28.7 24.2 4.9c-1.1-1.6-2.5-1.5-3-1.4-.7.2-2 .8-2.4 3.1-2.1 8-6.1 12.2-9.2 14.3l-6.4 4.5C1.7 26.4.8 28 .7 29.8c-.1 1.5.3 2.9 1.2 4.1 1.1 1.5 3 4.3 4 5.8.7 1 1.6 1.8 2.7 2.2.8.3 1.5.4 2.3.4 1.2 0 2.4-.4 3.4-1.1l3.9-2.8 4.4 6.2c.6.9 1.9 1.1 2.8.5L27 44c.9-.6 1.1-1.9.5-2.8l-4.2-6c3.2-1.6 7.8-2.8 14-2.2 2.4.4 3.4-.6 3.8-1.2.3-.3.9-1.5-.2-3.1zM21 32.1l-6.8-9.7c2.9-2.7 6.1-6.8 8-13.3l7 10 7 10c-6.7-.4-11.7 1.1-15.2 3zM42.7 12.2 38.6 15c-.7.5-1.6.3-2.1-.4s-.3-1.6.4-2.1L41 9.7c.7-.5 1.6-.3 2.1.4.5.6.3 1.6-.4 2.1zM33.9 3.7l-2.1 4.5c-.4.8-1.2 1.1-2 .7-.8-.4-1.1-1.2-.7-2l2.1-4.5c.4-.8 1.2-1.1 2-.7.8.4 1.1 1.3.7 2zM46.2 23.8l-5 .4c-.8.1-1.6-.5-1.6-1.4-.1-.8.5-1.6 1.4-1.6l5-.4c.8-.1 1.6.5 1.6 1.4 0 .8-.6 1.6-1.4 1.6z"></path></svg><span>相談で聞くこと</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">途中でやめるときの条件と、返金の扱いを確認してください。</p>
</div></div>



<div class="swell-block-button red_ is-style-btn_solid" data-id="9d8702f2"><a href="https://px.a8.net/svt/ejp?a8mat=4BCGFN+2OG8S2+5WXU+5YZ75&amp;a8sns=etc" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>スタスタLIVE英検の無料カウンセリングを予約する</span></a></div>



<h3 id="svc-samurai" class="wp-block-heading">試験の直前だけ、集中して見てほしい：さむらい英語塾</h3>


	<div class="swell-block-review">
		<div class='swell-block-review__inner'>
							<div class='swell-block-review__title'>
					<span>さむらい英語塾</span>
				</div>
						<figure class="swell-block-review__image"><img decoding="async" class="__img wp-image-7894" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-115.png" alt="" width="780" height="149" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-115.png 780w, https://lawcityblog.com/wp-content/uploads/2026/10/image-115-498x95.png 498w, https://lawcityblog.com/wp-content/uploads/2026/10/image-115-300x57.png 300w, https://lawcityblog.com/wp-content/uploads/2026/10/image-115-765x146.png 765w" sizes="(max-width: 780px) 100vw, 780px" /></figure>										<div class='swell-block-review__merits'>
					<div class='__label'>メリット</div>
					<ul class='__list is-style-good_list'>
						<li>担当講師と管理者の2人体制で、専用アプリで授業の記録と宿題を管理できる</li><li>月謝コースは入会金がかからない</li><li>回数を決めて買い切る短期コースがあり、直前期だけ使える</li>					</ul>
				</div>
										<div class='swell-block-review__demerits'>
					<div class='__label'>デメリット</div>
					<ul class='__list is-style-bad_list'>
						<li>月謝は60分×月4回で37,400円と、4つの中では高め</li><li>体験は無料ではなく、500円かかる</li><li>大人の生徒も在籍していて、中高生専門ではない</li>					</ul>
				</div>
					</div>
	</div>
	<script type="application/ld+json">{"@context":"https://schema.org","@graph": [{"@type":"Product","name":"さむらい英語塾","image":"https:\/\/lawcityblog.com\/wp-content\/uploads\/2026\/10\/image-115.png","review":{"@type":"Review","positiveNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"担当講師と管理者の2人体制で、専用アプリで授業の記録と宿題を管理できる"},{"@type":"ListItem","position":2,"name":"月謝コースは入会金がかからない"},{"@type":"ListItem","position":3,"name":"回数を決めて買い切る短期コースがあり、直前期だけ使える"}]},"negativeNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"月謝は60分×月4回で37,400円と、4つの中では高め"},{"@type":"ListItem","position":2,"name":"体験は無料ではなく、500円かかる"},{"@type":"ListItem","position":3,"name":"大人の生徒も在籍していて、中高生専門ではない"}]},"author":{"@type":"Person","name":"Mino"},"publisher":{"@id":"https:\/\/lawcityblog.com\/#organization"},"datePublished":"2026-10-31T13:51:14+0900"}}]}</script>


<p class="wp-block-paragraph"><strong><a href="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8592.12168&amp;dna=143605" data-type="link" data-id="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8592.12168&amp;dna=143605">さむらい英語塾</a></strong>は、<strong><span class="swl-marker mark_yellow">英検5級から準1級の対策に特化した、オンラインの1対1の塾</span></strong>です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>月謝コース</th><td>60分×月4回37,400円／90分×月4回55,000円（入会金0円）</td></tr><tr><th>短期駆込みコース</th><td>60分×5コマ49,500円／8コマ77,000円／12コマ112,200円（入会金11,000円・利用期限60日）</td></tr><tr><th>体験</th><td>ワンコインコーチング（500円）</td></tr><tr><th>解約</th><td>月謝コースは、決済日の7日前までに連絡すれば退会できる</td></tr></tbody></table><figcaption class="wp-element-caption">料金と条件（2026年10月時点・税込）</figcaption></figure>



<div class="pb-compare-box" data-colset="1"><div class="pb-compare-box__head"><div class="pb-compare-box__head__l">向いている人</div><div class="pb-compare-box__head__r">向いていない人</div></div>
<div class="pb-compare-box__body">
<div class="pb-compare-box__body__l">
<ul class="pb-list -icon-check -border-on">
<li>試験日が近く、ライティングや面接を数回だけ集中して見てほしい人。</li>
</ul>
</div>



<div class="pb-compare-box__body__r">
<ul class="pb-list -icon-check -border-on">
<li>費用を抑えて、長く続けたい人。</li>
</ul>
</div>
</div>
</div>



<div class="swell-block-button red_ is-style-btn_solid" data-id="e8c2f21f"><a href="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8592.12168&amp;dna=143605" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>さむらい英語塾の500円体験を申し込む</span></a></div>



<h3 id="svc-outcome" class="wp-block-heading">英検と受験の英語を一緒に伸ばしたい：OUTCOME</h3>


	<div class="swell-block-review">
		<div class='swell-block-review__inner'>
							<div class='swell-block-review__title'>
					<span>OUTCOME</span>
				</div>
						<figure class="swell-block-review__image"><img decoding="async" class="__img wp-image-7764" src="https://lawcityblog.com/wp-content/uploads/2026/10/image-103.png" alt="" width="780" height="389" srcset="https://lawcityblog.com/wp-content/uploads/2026/10/image-103.png 780w, https://lawcityblog.com/wp-content/uploads/2026/10/image-103-300x149.png 300w, https://lawcityblog.com/wp-content/uploads/2026/10/image-103-499x249.png 499w, https://lawcityblog.com/wp-content/uploads/2026/10/image-103-768x383.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>										<div class='swell-block-review__merits'>
					<div class='__label'>メリット</div>
					<ul class='__list is-style-good_list'>
						<li>受験の英語を基礎から学びながら、英検の4技能もまとめて対策できる</li><li>無料の体験授業を、2時間×3回受けられる</li><li>生徒1人を、2人の講師が担当する</li>					</ul>
				</div>
										<div class='swell-block-review__demerits'>
					<div class='__label'>デメリット</div>
					<ul class='__list is-style-bad_list'>
						<li>対象は中3〜高2で、中1・中2と高3は受けられない</li><li>入塾金が33,000円かかる</li><li>「英検合格保証制度」の表記はあるが、条件は公式サイトで確認できなかった</li>					</ul>
				</div>
					</div>
	</div>
	<script type="application/ld+json">{"@context":"https://schema.org","@graph": [{"@type":"Product","name":"OUTCOME","image":"https:\/\/lawcityblog.com\/wp-content\/uploads\/2026\/10\/image-103.png","review":{"@type":"Review","positiveNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"受験の英語を基礎から学びながら、英検の4技能もまとめて対策できる"},{"@type":"ListItem","position":2,"name":"無料の体験授業を、2時間×3回受けられる"},{"@type":"ListItem","position":3,"name":"生徒1人を、2人の講師が担当する"}]},"negativeNotes":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"name":"対象は中3〜高2で、中1・中2と高3は受けられない"},{"@type":"ListItem","position":2,"name":"入塾金が33,000円かかる"},{"@type":"ListItem","position":3,"name":"「英検合格保証制度」の表記はあるが、条件は公式サイトで確認できなかった"}]},"author":{"@type":"Person","name":"Mino"},"publisher":{"@id":"https:\/\/lawcityblog.com\/#organization"},"datePublished":"2026-10-31T13:51:14+0900"}}]}</script>


<p class="wp-block-paragraph"><strong><a href="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8593.12169&amp;dna=143609" data-type="link" data-id="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8593.12169&amp;dna=143609">オンライン英語塾OUTCOME</a></strong>は、<strong><span class="swl-marker mark_yellow">中3〜高2を対象にした、英語専門のオンライン個別指導塾</span></strong>です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>月額</th><td>39,600円（週2回）</td></tr><tr><th>入塾金</th><td>33,000円</td></tr><tr><th>対象</th><td>中学3年生〜高校2年生</td></tr><tr><th>体験</th><td>無料体験授業 2時間×3回（資料請求と個別面談のあと）</td></tr></tbody></table><figcaption class="wp-element-caption">料金と条件（2026年10月時点・税込）</figcaption></figure>



<div class="pb-compare-box" data-colset="1"><div class="pb-compare-box__head"><div class="pb-compare-box__head__l">向いている人</div><div class="pb-compare-box__head__r">向いていない人</div></div>
<div class="pb-compare-box__body">
<div class="pb-compare-box__body__l">
<ul class="pb-list -icon-check -border-on">
<li>高校入試や大学入試の英語と英検を、同じ塾でまとめて対策したい中3〜高2の人。</li>
</ul>
</div>



<div class="pb-compare-box__body__r">
<ul class="pb-list -icon-check -border-on">
<li>英検の直前だけ、短い期間で対策したい人。</li>
</ul>
</div>
</div>
</div>



<div class="swell-block-capbox cap_box is-style-small_ttl" data-colset="col3"><div class="cap_box_ttl" data-has-icon="1"><svg height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 48 48"><path d="M97.6 13.9c-.5-.7-.4-1.6.2-2l3.6-2.5c.6-.4 1.5-.2 1.9.5.5.7.4 1.6-.2 2l-3.6 2.5c-.6.4-1.5.2-1.9-.5zM100.7 22.4c-.1-.8.5-1.5 1.2-1.6l4.4-.4c.7-.1 1.4.6 1.4 1.4.1.8-.5 1.5-1.2 1.6l-4.4.4c-.7.1-1.4-.6-1.4-1.4zM90.6 8.1c-.7-.3-1.1-1.2-.8-1.8l1.8-4c.3-.6 1.2-.9 1.9-.6.7.3 1.1 1.2.8 1.8l-1.8 4c-.3.7-1.2.9-1.9.6zM40.9 28.7 24.2 4.9c-1.1-1.6-2.5-1.5-3-1.4-.7.2-2 .8-2.4 3.1-2.1 8-6.1 12.2-9.2 14.3l-6.4 4.5C1.7 26.4.8 28 .7 29.8c-.1 1.5.3 2.9 1.2 4.1 1.1 1.5 3 4.3 4 5.8.7 1 1.6 1.8 2.7 2.2.8.3 1.5.4 2.3.4 1.2 0 2.4-.4 3.4-1.1l3.9-2.8 4.4 6.2c.6.9 1.9 1.1 2.8.5L27 44c.9-.6 1.1-1.9.5-2.8l-4.2-6c3.2-1.6 7.8-2.8 14-2.2 2.4.4 3.4-.6 3.8-1.2.3-.3.9-1.5-.2-3.1zM21 32.1l-6.8-9.7c2.9-2.7 6.1-6.8 8-13.3l7 10 7 10c-6.7-.4-11.7 1.1-15.2 3zM42.7 12.2 38.6 15c-.7.5-1.6.3-2.1-.4s-.3-1.6.4-2.1L41 9.7c.7-.5 1.6-.3 2.1.4.5.6.3 1.6-.4 2.1zM33.9 3.7l-2.1 4.5c-.4.8-1.2 1.1-2 .7-.8-.4-1.1-1.2-.7-2l2.1-4.5c.4-.8 1.2-1.1 2-.7.8.4 1.1 1.3.7 2zM46.2 23.8l-5 .4c-.8.1-1.6-.5-1.6-1.4-.1-.8.5-1.6 1.4-1.6l5-.4c.8-.1 1.6.5 1.6 1.4 0 .8-.6 1.6-1.4 1.6z"></path></svg><span>面談で聞くこと</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">英検合格保証制度の条件と、契約期間・解約の条件を確認してください。</p>



<p class="wp-block-paragraph">英検®だけでなく、大学受験の英語全体を独学で進める順番と残り期間別の計画は、こちらにまとめています。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/10/Gemini_Generated_Image_xfjk13xfjk13xfjk-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/eigo-dokugaku/">英語は独学で間に合う？大学受験の単語・文法・長文の順番と計画</a>
											</div>
				</div>
			</div>
		</div></div></div>



<div class="swell-block-button red_ is-style-btn_solid" data-id="f1f32db4"><a href="https://www.rentracks.jp/adx/r.html?idx=0.44074.303606.8593.12169&amp;dna=143609" class="swell-block-button__link" data-has-icon="1"><svg class="__icon" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="16"></circle><polyline points="134.1 161.9 168 128 134.1 94.1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><line x1="88" y1="128" x2="168" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line></svg><span>OUTCOMEの無料体験授業を申し込む</span></a></div>



<h2 id="jiki" class="wp-block-heading">時期別：次の試験までの進め方</h2>



<p class="wp-block-paragraph">次の試験までの進め方の一例をご紹介します。</p>



<p class="wp-block-paragraph">例えば現在が2026年10月だとすると、第3回の一次試験までは、約3か月半あります。次の表を、自分の予定に合わせて調整してください。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>時期</th><th>やること</th><th>確かめること</th></tr></thead><tbody><tr><th>10月</th><td>過去問1回分で正答率を測り、受ける級を決める</td><td>申込は10月30日から</td></tr><tr><th>11月</th><td>単語帳を1周する。ライティングを週2本書いて点検する</td><td>弱い技能はどれか</td></tr><tr><th>12月</th><td>過去問を週1回分解く。ライティングを人やAIに見てもらう</td><td>申込の締切は12月14日</td></tr><tr><th>1月</th><td>過去問の見直しと、時間配分の確認</td><td>一次試験は1月24日（本会場）</td></tr><tr><th>2〜3月</th><td>面接の練習（音読と、質問への答え方）</td><td>二次試験はB日程なら3月7日</td></tr></tbody></table><figcaption class="wp-element-caption">第3回に向けた時期別の進め方</figcaption></figure>



<p class="wp-block-paragraph">第3回に間に合わないと感じたら、無理をせず、2027年度第1回を目標にし直す方法もあります。英検S-CBTなら、受ける日を自分で選べます。</p>



<p class="is-style-icon_info wp-block-paragraph"><strong>保護者の方へ</strong><br>高校入試や大学入試で英検を使う予定があるなら、いつまでに取った級が出願に使えるかを、志望校の募集要項で確かめておくと安心です。受ける回を決めるときの手がかりになります。</p>



<h2 id="faq" class="wp-block-heading">よくある質問</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="426" src="https://lawcityblog.com/wp-content/uploads/2026/09/image-331.png" alt="Q&amp;A" class="wp-image-5855" srcset="https://lawcityblog.com/wp-content/uploads/2026/09/image-331.png 780w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-300x163.png 300w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-498x272.png 498w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-768x419.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<dl class="swell-block-faq -icon-circle" data-q="col-custom" data-a="col-main">
<div class="swell-block-faq__item"><dt class="faq_q">英検は何級まで独学で合格できますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">3級から2級までは、単語帳と過去問、ライティングを点検する手段があれば、独学で合格を目指せます。準1級は覚える語彙が大きく増え、要約と意見論述の質も問われます。準1級を受ける人は、ライティングだけでも添削を受けることをおすすめします。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">中学生でも独学で2級を目指せますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">目指せます。ただし2級の英文は社会的な話題が中心で、中学校の授業で習う単語だけでは足りません。準2級か準2級プラスに合格してから、2級の単語帳に進む順番が無理のない進め方です。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">ライティングは独学だけで点が取れますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">型を覚え、語数とミスを点検するところまでは独学で進められます。内容が問いに合っているか、理由に説得力があるかは、自分では判断しにくい部分です。AIの採点や学校の先生、オンライン塾で、ときどき第三者に見てもらってください。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">従来型と英検S-CBTは、どちらを受ければいいですか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">どちらでも、取れる級の資格とスコアは同じです。S-CBTは日程を自分で選べ、同じ検定回で同じ級を最大3回まで受けられます。受ける日を選びたい人や、受験の機会を増やしたい人に向いています。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">オンライン塾は、いつから使えばいいですか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">まず過去問を1回分解き、正答率を見てから決めれば十分です。残り期間が短く、正答率が5割に届かないときや、書く・話すを1対1で見てほしいときは、早めに体験や相談を受けてください。</p>
</dd></div>
</dl>
<script type="application/ld+json">{"@context":"https:\/\/schema.org","@id":"#FAQContents","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"英検は何級まで独学で合格できますか？","acceptedAnswer":{"@type":"Answer","text":"<p>3級から2級までは、単語帳と過去問、ライティングを点検する手段があれば、独学で合格を目指せます。準1級は覚える語彙が大きく増え、要約と意見論述の質も問われます。準1級を受ける人は、ライティングだけでも添削を受けることをおすすめします。<\/p>"}},{"@type":"Question","name":"中学生でも独学で2級を目指せますか？","acceptedAnswer":{"@type":"Answer","text":"<p>目指せます。ただし2級の英文は社会的な話題が中心で、中学校の授業で習う単語だけでは足りません。準2級か準2級プラスに合格してから、2級の単語帳に進む順番が無理のない進め方です。<\/p>"}},{"@type":"Question","name":"ライティングは独学だけで点が取れますか？","acceptedAnswer":{"@type":"Answer","text":"<p>型を覚え、語数とミスを点検するところまでは独学で進められます。内容が問いに合っているか、理由に説得力があるかは、自分では判断しにくい部分です。AIの採点や学校の先生、オンライン塾で、ときどき第三者に見てもらってください。<\/p>"}},{"@type":"Question","name":"従来型と英検S-CBTは、どちらを受ければいいですか？","acceptedAnswer":{"@type":"Answer","text":"<p>どちらでも、取れる級の資格とスコアは同じです。S-CBTは日程を自分で選べ、同じ検定回で同じ級を最大3回まで受けられます。受ける日を選びたい人や、受験の機会を増やしたい人に向いています。<\/p>"}},{"@type":"Question","name":"オンライン塾は、いつから使えばいいですか？","acceptedAnswer":{"@type":"Answer","text":"<p>まず過去問を1回分解き、正答率を見てから決めれば十分です。残り期間が短く、正答率が5割に届かないときや、書く・話すを1対1で見てほしいときは、早めに体験や相談を受けてください。<\/p>"}}]}</script>



<h2 id="matome" class="wp-block-heading">まとめ：過去問1回分で現在地を測り、書く・話すの補い方を決める</h2>



<p class="wp-block-paragraph">3級から2級までは、級に合った単語帳と過去問があれば、独学で間に合う人が多いです。独学で足りなくなりやすいのは、自分では採点できないライティングと面接です。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>技能</th><th>独学でやること</th><th>補うなら</th></tr></thead><tbody><tr><th>単語</th><td>級に合った単語帳を1冊、繰り返す</td><td>—</td></tr><tr><th>リーディング・リスニング</th><td>過去問を、時間を計って解く</td><td>—</td></tr><tr><th>ライティング</th><td>型を覚え、英作文チェッカーで点検する</td><td>AIの採点（UGUIS.AI）、オンライン塾</td></tr><tr><th>面接</th><td>毎日の音読と、質問への答えの練習</td><td>オンライン塾（英論会、スタスタLIVE英検など）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">まずは今日、受ける級の過去問を1回分、時間を計って解いてみてください。ライティングの答案を書いたら、英作文チェッカーに貼りつけて点検するところから始めましょう。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/09/Gemini_Generated_Image_7ljkda7ljkda7ljk-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-writing-checker/">英作文チェッカー【無料・登録不要】英検®ライティングの語数と文法ミスを自動チェック</a>
											</div>
				</div>
			</div>
		</div>]]></content:encoded>
					
					<wfw:commentRss>https://lawcityblog.com/eiken-dokugaku/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>英作文チェッカー【無料・登録不要】英検®ライティングの語数と文法ミスを自動チェック</title>
		<link>https://lawcityblog.com/english-writing-checker/</link>
					<comments>https://lawcityblog.com/english-writing-checker/#respond</comments>
		
		<dc:creator><![CDATA[Mino]]></dc:creator>
		<pubDate>Thu, 24 Sep 2026 11:13:32 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[受験勉強]]></category>
		<category><![CDATA[大学受験]]></category>
		<category><![CDATA[大学受験　英語]]></category>
		<category><![CDATA[演習テスト]]></category>
		<category><![CDATA[知識プリント]]></category>
		<category><![CDATA[英検]]></category>
		<category><![CDATA[試験対策]]></category>
		<category><![CDATA[高校受験]]></category>
		<category><![CDATA[高校受験　英語　]]></category>
		<category><![CDATA[テーマ]]></category>
		<category><![CDATA[ライティング]]></category>
		<category><![CDATA[無料]]></category>
		<category><![CDATA[英作文]]></category>
		<category><![CDATA[要約]]></category>
		<guid isPermaLink="false">https://lawcityblog.com/?p=6232</guid>

					<description><![CDATA[<p><img src="https://lawcityblog.com/wp-content/uploads/2026/09/Gemini_Generated_Image_7ljkda7ljkda7ljk.jpeg" class="webfeedsFeaturedVisual" /></p>英作文で点を落とす原因の多くは、難しい文法ではありません。 三単現の s の抜け、文頭の小文字、語数不足など基本的なミスであることが多いです。 英検®のライティングでも大学入試の自由英作文でも、こうした基本ミスは減点の対 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://lawcityblog.com/wp-content/uploads/2026/09/Gemini_Generated_Image_7ljkda7ljkda7ljk.jpeg" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">英作文で点を落とす原因の多くは、難しい文法ではありません。</p>



<p class="has-border -border01 wp-block-paragraph"><strong><span class="swl-marker mark_yellow">三単現の s の抜け、文頭の小文字、語数不足など基本的なミスであることが多いです。</span></strong></p>



<p class="wp-block-paragraph">英検®のライティングでも大学入試の自由英作文でも、こうした基本ミスは減点の対象になりやすいところです。</p>



<p class="wp-block-paragraph">自分で勉強していて大変なことは、<strong><span class="swl-marker mark_orange">書いた本人にはそのミスがどこにあるかがほとんど見えない</span></strong>ことです。</p>



<p class="wp-block-paragraph">それは、<strong>自分の英文は自身で意味がわかっているため、読み流してしまう</strong>からです。</p>



<p class="has-border -border04 wp-block-paragraph">このページのツールは、書いた英文を貼るだけで、<strong><span class="swl-marker mark_blue">減点されやすい51項目の基本ミス</span></strong>をその場で洗い出します。<br><strong><span class="swl-marker mark_blue">英検®3級〜準1級の意見論述・Eメール・要約、大学入試の自由英作文と和文英訳に対応</span></strong>し、<strong>直し方をワンタップで本文に反映</strong>できます。無料・登録不要で、回数の制限もありません。</p>



<h2 class="wp-block-heading">英作文チェッカー</h2>



<p class="is-style-big_icon_check wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">「試験」「級」「問題形式」を選び、下の枠に英文を書くか貼りつけて「チェックする」を押してください。<br></mark></strong>このツールがどのように動作するのかを見たい人は、「サンプルで試す」を押すと、ミスを含んだ答案で結果を確認できます。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/Gemini_Generated_Image_xgl43exgl43exgl4-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-theme-maker/">自由英作文テーマ600題＋英検®お題メーカー【無料】段階ヒント・模範解答つき</a>
											</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -external" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">note（ノート）</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://assets.st-note.com/production/uploads/images/322955005/rectangle_large_type_2_0189a196b286d4cece19b789fe975b7d.jpeg?fit=bounds&#038;quality=85&#038;width=1280" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://note.com/bunkeilab/n/n35b25107f96f" target="_blank" rel="noopener noreferrer">【2027年度入試】自由英作文 予想問題集｜80大学を徹底分析・予想97題・模範解答つき｜文系ラボ｜受験プリ&#8230;</a>
											</div>
				</div>
			</div>
		</div>


<p class="wp-block-paragraph"> <div id="ewc_root" data-cfg="{&quot;ver&quot;:&quot;1.2&quot;,&quot;vfile&quot;:&quot;1-2&quot;,&quot;api&quot;:&quot;https:\/\/lawcityblog.com\/wp-json\/ewc\/v1\/&quot;,&quot;nonce&quot;:&quot;c4ee08f6fc&quot;,&quot;log&quot;:1,&quot;pid&quot;:6232,&quot;data&quot;:&quot;https:\/\/lawcityblog.com\/wp-content\/uploads\/ewc\/&quot;,&quot;nlp&quot;:&quot;compromise.min_.js&quot;,&quot;default&quot;:{&quot;exam&quot;:&quot;univ&quot;,&quot;grade&quot;:&quot;univ&quot;,&quot;format&quot;:&quot;UF&quot;},&quot;sponsor&quot;:{&quot;on&quot;:1,&quot;name&quot;:&quot;UGUIS.AI&quot;,&quot;url&quot;:&quot;https:\/\/t.felmat.net\/r\/5b4egzr?pb=&quot;,&quot;pr&quot;:&quot;PR&quot;,&quot;review&quot;:&quot;https:\/\/lawcityblog.com\/uguis-ai\/&quot;,&quot;review_t&quot;:&quot;AI\u63a1\u70b9\u30b5\u30fc\u30d3\u30b9\u3092\u6bd4\u3079\u3066\u304b\u3089\u6c7a\u3081\u305f\u3044&quot;,&quot;review_b&quot;:&quot;UGUIS.AI \u306e\u30ec\u30d3\u30e5\u30fc\u8a18\u4e8b\uff08\u6599\u91d1\u30fb\u4f7f\u3044\u65b9\u30fb\u5411\u3044\u3066\u3044\u308b\u4eba\uff09&quot;,&quot;slots&quot;:{&quot;content&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u5185\u5bb9\u306e\u63a1\u70b9\u306f\u3001AI\u63a1\u70b9\u30b5\u30fc\u30d3\u30b9\u3067\u53d7\u3051\u3089\u308c\u307e\u3059&quot;,&quot;b&quot;:&quot;UGUIS.AI \u3067\u8a9e\u5f59\u30fb\u6587\u6cd5\u30fb\u5185\u5bb9\u30fb\u69cb\u6210\u306e4\u89b3\u70b9\u306e\u63a1\u70b9\u3092\u53d7\u3051\u3089\u308c\u307e\u3059&quot;,&quot;btn&quot;:&quot;AI\u63a1\u70b9\u3092\u53d7\u3051\u308b&quot;,&quot;u&quot;:&quot;&quot;},&quot;zero&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u57fa\u672c\u30df\u30b9\u306f\u30bc\u30ed\u3067\u3059&quot;,&quot;b&quot;:&quot;\u5185\u5bb9\u3068\u8868\u73fe\u306e\u63a1\u70b9\u306b\u9032\u307f\u307e\u3057\u3087\u3046\u3002UGUIS.AI \u306f\u82f1\u691c\u00ae\u6e961\u7d1a\u301c3\u7d1a\u306e\u610f\u898b\u8ad6\u8ff0\u30fbE\u30e1\u30fc\u30eb\u30fb\u8981\u7d04\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059&quot;,&quot;btn&quot;:&quot;AI\u63a1\u70b9\u306b\u9032\u3080&quot;,&quot;u&quot;:&quot;&quot;},&quot;stall&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u81ea\u5206\u3067\u306f\u6c17\u3065\u3051\u306a\u3044\u6539\u5584\u70b9\u3092\u898b\u3064\u3051\u3066\u3082\u3089\u3044\u307e\u3057\u3087\u3046&quot;,&quot;b&quot;:&quot;3\u56de\u4ee5\u4e0a\u76f4\u3057\u3066\u3082\u70b9\u304c\u4f38\u3073\u306a\u3044\u3068\u304d\u306f\u3001\u5185\u5bb9\u306e\u63a1\u70b9\u3092\u53d7\u3051\u308b\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u3059&quot;,&quot;btn&quot;:&quot;AI\u63a1\u70b9\u3092\u53d7\u3051\u308b&quot;,&quot;u&quot;:&quot;&quot;},&quot;summary&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u8981\u7d04\u306e\u5185\u5bb9\u304c\u539f\u6587\u3092\u6b63\u3057\u304f\u6349\u3048\u3066\u3044\u308b\u304b\u306f\u3001AI\u63a1\u70b9\u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059&quot;,&quot;b&quot;:&quot;&quot;,&quot;btn&quot;:&quot;AI\u63a1\u70b9\u3067\u78ba\u8a8d\u3059\u308b&quot;,&quot;u&quot;:&quot;&quot;},&quot;topic&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u672c\u756a\u305d\u3063\u304f\u308a\u306e\u554f\u984c\u3092\u3082\u3063\u3068\u89e3\u304d\u305f\u3044\u4eba\u306f\u3053\u3061\u3089&quot;,&quot;b&quot;:&quot;&quot;,&quot;btn&quot;:&quot;\u554f\u984c\u3092\u89e3\u304f&quot;,&quot;u&quot;:&quot;&quot;},&quot;hand&quot;:{&quot;on&quot;:1,&quot;t&quot;:&quot;\u7d19\u306b\u66f8\u3044\u305f\u7b54\u6848\u3092\u30ab\u30e1\u30e9\u3067\u8aad\u307f\u8fbc\u3081\u308b\u63a1\u70b9\u30b5\u30fc\u30d3\u30b9\u3082\u3042\u308a\u307e\u3059&quot;,&quot;b&quot;:&quot;&quot;,&quot;btn&quot;:&quot;\u304f\u308f\u3057\u304f&quot;,&quot;u&quot;:&quot;&quot;}}},&quot;quest&quot;:&quot;https:\/\/lawcityblog.com\/eibunpou-maker\/&quot;,&quot;foot&quot;:{&quot;t&quot;:&quot;&quot;,&quot;u&quot;:&quot;&quot;},&quot;etm&quot;:{&quot;index&quot;:&quot;https:\/\/lawcityblog.com\/wp-content\/uploads\/etm\/etm-index-v2-0.json&quot;,&quot;maker&quot;:&quot;https:\/\/lawcityblog.com\/english-theme-maker\/&quot;},&quot;show&quot;:{&quot;timer&quot;:1,&quot;hist&quot;:1,&quot;flag&quot;:1,&quot;share&quot;:1,&quot;print&quot;:1}}"><style>#ewc_root{--ewc-red:#b7412f;--ewc-ink:#23201c}#ewc_root{
 --ewc-paper:#fbf8f1;--ewc-paper2:#ffffff;--ewc-line:#e6dcc8;--ewc-line2:#d8ccb2;
 --ewc-mut:#7b7266;--ewc-navy:#1f6fb2;--ewc-ok:#2f7d55;--ewc-warn:#c8811f;
 --ewc-mincho:"Yu Mincho","YuMincho","Hiragino Mincho ProN",'游明朝',serif;
 --ewc-mono:"SFMono-Regular",Menlo,Consolas,monospace;
 all:initial;display:block;box-sizing:border-box;
 font-family:-apple-system,BlinkMacSystemFont,"Hiragino Sans","Noto Sans JP","Helvetica Neue",Arial,sans-serif;
 color:var(--ewc-ink);background:var(--ewc-paper);line-height:1.8;font-size:15px;
 border:1px solid var(--ewc-line2);border-radius:14px;overflow:hidden;
 box-shadow:0 10px 34px rgba(60,45,25,.10);margin:28px 0;-webkit-text-size-adjust:100%;
}
#ewc_root *{box-sizing:border-box;font-family:inherit}
#ewc_root div,#ewc_root p,#ewc_root span,#ewc_root section,#ewc_root details,#ewc_root summary{
 margin:0;padding:0;background:none;border:0;border-radius:0;box-shadow:none;
 color:inherit;text-align:left;text-indent:0;text-decoration:none;counter-reset:none;counter-increment:none}
#ewc_root b,#ewc_root strong{font-weight:700;color:inherit;background:none}
#ewc_root .ewc-title:before,#ewc_root .ewc-title:after,#ewc_root .ewc-h2:before,#ewc_root .ewc-h2:after,
#ewc_root .ewc-eyebrow:before,#ewc_root .ewc-eyebrow:after,#ewc_root .ewc-lead:before,#ewc_root .ewc-lead:after{content:none;display:none}
#ewc_root p,#ewc_root h1,#ewc_root h2,#ewc_root h3,#ewc_root ul,#ewc_root ol,#ewc_root li{margin:0;padding:0;list-style:none}
#ewc_root button{font:inherit;cursor:pointer;border:0;background:none;color:inherit}
#ewc_root button:focus-visible,#ewc_root a:focus-visible,#ewc_root input:focus-visible,#ewc_root select:focus-visible,#ewc_root textarea:focus-visible{outline:3px solid rgba(31,111,178,.55);outline-offset:2px}
#ewc_root a{color:var(--ewc-navy);text-decoration:none}
#ewc_root a:hover{text-decoration:underline}
#ewc_root .ewc-pad{padding:22px 20px}
#ewc_root .ewc-hide{display:none!important}
#ewc_root summary{cursor:pointer;list-style:none}
#ewc_root summary::-webkit-details-marker{display:none}

/* ヘッダー */
#ewc_root .ewc-hd{position:relative;padding:26px 20px 20px;background:
  repeating-linear-gradient(90deg,transparent 0 31px,rgba(183,65,47,.10) 31px 32px),
  linear-gradient(180deg,#fffdf8 0%,var(--ewc-paper) 100%);border-bottom:1px solid var(--ewc-line2)}
#ewc_root .ewc-hd:after{content:"";display:block;position:absolute;left:0;right:0;bottom:-1px;height:2px;
  background:linear-gradient(90deg,transparent,var(--ewc-red),transparent);opacity:.55}
#ewc_root .ewc-eyebrow{font-size:10.5px;letter-spacing:.3em;color:var(--ewc-red);margin:0 0 8px;font-weight:700}
#ewc_root .ewc-title{display:block;font-family:var(--ewc-mincho);font-size:26px;font-weight:700;letter-spacing:.05em;margin:0 0 8px;line-height:1.35}
#ewc_root .ewc-lead{font-size:13.5px;color:var(--ewc-mut);margin:0;max-width:60em}
#ewc_root .ewc-note{margin-top:12px;font-size:12px;color:var(--ewc-mut);background:rgba(255,255,255,.7);border:1px dashed var(--ewc-line2);border-radius:8px;padding:8px 11px}
#ewc_root .ewc-count{display:inline-block;margin-top:6px;font-size:12px;color:var(--ewc-red);font-weight:700}

/* 設定 */
#ewc_root .ewc-set{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin-bottom:14px}
#ewc_root .ewc-f{display:flex;flex-direction:column;gap:5px;min-width:0}
#ewc_root .ewc-f-wide{grid-column:1/-1}
#ewc_root .ewc-f label{font-size:11.5px;letter-spacing:.1em;color:var(--ewc-mut);font-weight:700}
#ewc_root .ewc-f input,#ewc_root .ewc-f select,#ewc_root .ewc-f textarea{
  width:100%;padding:9px 11px;font-size:14px;color:var(--ewc-ink);background:var(--ewc-paper2);
  border:1px solid var(--ewc-line2);border-radius:8px;outline:none;-webkit-appearance:none;appearance:none;resize:vertical;line-height:1.5}
#ewc_root .ewc-f select{background-image:linear-gradient(45deg,transparent 50%,var(--ewc-mut) 50%),linear-gradient(135deg,var(--ewc-mut) 50%,transparent 50%);
  background-position:calc(100% - 17px) 17px,calc(100% - 12px) 17px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:30px}
#ewc_root .ewc-f select:disabled{opacity:.5}
#ewc_root .ewc-f input:focus,#ewc_root .ewc-f select:focus,#ewc_root .ewc-f textarea:focus{border-color:var(--ewc-red);box-shadow:0 0 0 3px rgba(183,65,47,.12)}
#ewc_root .ewc-hint{font-size:11px;color:var(--ewc-mut)}
#ewc_root .ewc-inline{display:flex;align-items:center;gap:6px}
#ewc_root .ewc-inline input{width:80px!important}
#ewc_root .ewc-range{font-size:14px;padding:9px 0;font-weight:700}
#ewc_root .ewc-range small{font-weight:400;color:var(--ewc-mut);font-size:11px;display:block;line-height:1.4}
#ewc_root .ewc-details{margin:0 0 14px;border:1px dashed var(--ewc-line2);border-radius:9px;padding:8px 12px;background:rgba(255,255,255,.5)}
#ewc_root .ewc-details summary{font-size:12.5px;color:var(--ewc-mut);font-weight:700}
#ewc_root .ewc-details summary:before{content:"▸ ";color:var(--ewc-red)}
#ewc_root .ewc-details[open] summary:before{content:"▾ "}
#ewc_root .ewc-details[open] summary{margin-bottom:10px}
#ewc_root .ewc-teach{margin:0 0 14px;padding:10px 13px;border:1px solid var(--ewc-red);border-radius:9px;background:rgba(183,65,47,.06);font-size:13px;line-height:1.7}
#ewc_root .ewc-teach b{display:block;color:var(--ewc-red)}
#ewc_root .ewc-teach-act{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:6px;font-size:12px;color:var(--ewc-mut)}
#ewc_root select[disabled],#ewc_root textarea[readonly],#ewc_root input[readonly]{opacity:.8;background:rgba(0,0,0,.035);cursor:default}
#ewc_root .ewc-locked .ewc-f select{border-style:dashed}

/* 入力 */
#ewc_root .ewc-tawrap{border:1px solid var(--ewc-line2);border-radius:10px;background:var(--ewc-paper2);overflow:hidden}
#ewc_root textarea#ewc-ta{display:block;width:100%;min-height:220px;padding:12px 14px;border:0;outline:none;resize:vertical;background:transparent;color:var(--ewc-ink);font-size:16px;line-height:1.8;font-family:Georgia,"Times New Roman",serif}
#ewc_root .ewc-meter{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:10px}
#ewc_root .ewc-wc{font-size:14px;font-weight:700;padding:4px 12px;border-radius:99px;border:1px solid var(--ewc-line2);background:var(--ewc-paper2);font-variant-numeric:tabular-nums;white-space:nowrap;min-width:5.5em;text-align:center}
#ewc_root .ewc-wc.in{border-color:var(--ewc-ok);color:var(--ewc-ok);background:rgba(47,125,85,.08)}
#ewc_root .ewc-wc.edge{border-color:var(--ewc-warn);color:var(--ewc-warn);background:rgba(200,129,31,.10)}
#ewc_root .ewc-wc.out{border-color:var(--ewc-red);color:var(--ewc-red);background:rgba(183,65,47,.08)}
#ewc_root .ewc-bar{flex:1 1 160px;height:8px;border-radius:99px;background:#eee6d6;overflow:hidden;position:relative;min-width:120px}
#ewc_root .ewc-bar i{display:block;height:100%;width:0;background:var(--ewc-red);transition:width .2s}
#ewc_root .ewc-bar.in i{background:var(--ewc-ok)}
#ewc_root .ewc-bar.edge i{background:var(--ewc-warn)}
#ewc_root .ewc-bar u{position:absolute;top:-3px;bottom:-3px;width:1px;background:rgba(0,0,0,.28);display:none}
#ewc_root .ewc-link{font-size:12px;color:var(--ewc-navy);text-decoration:underline;padding:0}
#ewc_root .ewc-howcount{font-size:12px;color:var(--ewc-mut);border:1px dashed var(--ewc-line2);border-radius:8px;padding:8px 11px;margin-top:8px;line-height:1.7}
#ewc_root .ewc-timer{font-size:13px;color:var(--ewc-mut);display:flex;gap:6px;align-items:center;margin-left:auto;font-variant-numeric:tabular-nums}
#ewc_root .ewc-timer b{font-size:15px}
#ewc_root .ewc-timer.warn b{color:var(--ewc-red)}
#ewc_root .ewc-timer button{font-size:11.5px;border:1px solid var(--ewc-line2);border-radius:99px;padding:2px 9px;background:var(--ewc-paper2);color:var(--ewc-mut)}
#ewc_root .ewc-btns{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px;align-items:center}
#ewc_root .ewc-go{background:var(--ewc-red);color:#fff;font-weight:700;font-size:16px;padding:13px 30px;border-radius:99px;box-shadow:0 6px 16px rgba(183,65,47,.28);transition:.15s;letter-spacing:.06em}
#ewc_root .ewc-go:hover{transform:translateY(-1px);box-shadow:0 9px 22px rgba(183,65,47,.34)}
#ewc_root .ewc-go[disabled]{opacity:.45;cursor:default;transform:none;box-shadow:none}
#ewc_root .ewc-sub{border:1px solid var(--ewc-line2);background:var(--ewc-paper2);border-radius:99px;padding:10px 17px;font-size:13.5px;color:var(--ewc-mut);transition:.15s}
#ewc_root .ewc-sub:hover{border-color:var(--ewc-red);color:var(--ewc-ink)}
#ewc_root .ewc-status{font-size:12px;color:var(--ewc-mut)}
#ewc_root .ewc-hand{margin-top:12px;font-size:12px;color:var(--ewc-mut)}
#ewc_root .ewc-hand a{color:var(--ewc-mut);text-decoration:underline}
#ewc_root .ewc-pr{display:inline-block;font-style:normal;font-size:10px;letter-spacing:.1em;color:var(--ewc-mut);border:1px solid var(--ewc-line2);border-radius:3px;padding:0 5px;margin-right:6px;font-weight:700;vertical-align:1px}

/* 結果 */
#ewc_root .ewc-res{border-top:1px solid var(--ewc-line2);background:linear-gradient(180deg,#fffdf8,var(--ewc-paper))}
#ewc_root .ewc-band{background:var(--ewc-red);color:#fff;border-radius:9px;padding:10px 14px;font-weight:700;margin:0 0 14px;font-size:14px}
#ewc_root .ewc-band.edge{background:var(--ewc-warn)}
#ewc_root .ewc-band small{display:block;font-weight:400;font-size:12px;opacity:.9}
#ewc_root .ewc-top{display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:6px}
#ewc_root .ewc-axes{display:grid;gap:9px}
#ewc_root .ewc-axh{font-size:11.5px;letter-spacing:.1em;color:var(--ewc-mut);font-weight:700}
#ewc_root .ewc-ax{display:grid;grid-template-columns:52px 1fr 64px;gap:10px;align-items:center;font-size:13px}
#ewc_root .ewc-ax i{display:block;height:10px;border-radius:99px;background:#eee6d6;overflow:hidden}
#ewc_root .ewc-ax i u{display:block;height:100%;background:var(--ewc-ok);border-radius:99px}
#ewc_root .ewc-ax b{text-align:right;font-variant-numeric:tabular-nums;font-weight:700}
#ewc_root .ewc-ax b small{font-weight:400;color:var(--ewc-mut);font-size:11px}
#ewc_root .ewc-ax.c1 i u{background:var(--ewc-red)}
#ewc_root .ewc-ax.c2 i u{background:var(--ewc-warn)}
#ewc_root .ewc-ax.c3 i u{background:var(--ewc-navy)}
#ewc_root .ewc-ax-content{display:grid;grid-template-columns:52px 1fr;gap:10px;align-items:center;font-size:13px;border:1px dashed var(--ewc-line2);border-radius:8px;padding:8px 10px;background:rgba(255,255,255,.6)}
#ewc_root .ewc-ax-content span{font-size:12.5px;color:var(--ewc-mut)}
#ewc_root .ewc-ax-content a{font-weight:700}
#ewc_root .ewc-diff{font-size:12.5px;color:var(--ewc-mut);display:flex;gap:12px;flex-wrap:wrap}
#ewc_root .ewc-diff em{font-style:normal;font-weight:700}
#ewc_root .ewc-diff em.up{color:var(--ewc-ok)}
#ewc_root .ewc-diff em.dn{color:var(--ewc-red)}

#ewc_root .ewc-h2{display:block;font-family:var(--ewc-mincho);font-size:17px;font-weight:700;margin:22px 0 12px;border-left:3px solid var(--ewc-red);padding:0 0 0 11px;letter-spacing:.04em;line-height:1.5}
#ewc_root .ewc-two{display:grid;grid-template-columns:1fr;gap:6px}
#ewc_root .ewc-hl{border:1px solid var(--ewc-line2);border-radius:10px;background:var(--ewc-paper2);padding:14px 16px;font-family:Georgia,"Times New Roman",serif;font-size:15.5px;line-height:1.9;white-space:pre-wrap;word-break:break-word;max-height:420px;overflow:auto}
#ewc_root .ewc-hl mark{background:rgba(183,65,47,.14);color:inherit;border-bottom:2px solid var(--ewc-red);border-radius:2px;padding:0 1px;cursor:pointer}
#ewc_root .ewc-hl mark.m2{background:rgba(200,129,31,.16);border-bottom-color:var(--ewc-warn)}
#ewc_root .ewc-hl mark.m1{background:rgba(31,111,178,.12);border-bottom-color:var(--ewc-navy)}
#ewc_root .ewc-hl mark.wide{background:rgba(183,65,47,.06);border-bottom:0;border-radius:0}
#ewc_root .ewc-hl mark.wide.m2{background:rgba(200,129,31,.07)}
#ewc_root .ewc-hl mark.wide.m1{background:rgba(31,111,178,.06)}
#ewc_root .ewc-hl mark.hit{background:rgba(183,65,47,.42)}
#ewc_root .ewc-legend{display:flex;gap:14px;flex-wrap:wrap;font-size:11.5px;color:var(--ewc-mut);margin-top:9px}
#ewc_root .ewc-legend span:before{content:"";display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}
#ewc_root .ewc-legend .l3:before{background:rgba(183,65,47,.45)}
#ewc_root .ewc-legend .l2:before{background:rgba(200,129,31,.45)}
#ewc_root .ewc-legend .l1:before{background:rgba(31,111,178,.35)}
#ewc_root .ewc-nums{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px;margin-top:12px}
#ewc_root .ewc-num{border:1px solid var(--ewc-line2);border-radius:9px;background:var(--ewc-paper2);padding:8px 10px}
#ewc_root .ewc-num span{display:block;font-size:11px;color:var(--ewc-mut);letter-spacing:.06em}
#ewc_root .ewc-num b{font-size:19px;font-weight:700;font-variant-numeric:tabular-nums}
#ewc_root .ewc-num b small{font-size:11px;font-weight:400;color:var(--ewc-mut);margin-left:2px}

#ewc_root .ewc-tabs{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:10px}
#ewc_root .ewc-tab{border:1px solid var(--ewc-line2);background:var(--ewc-paper2);border-radius:99px;padding:6px 14px;font-size:12.5px;color:var(--ewc-mut);transition:.15s}
#ewc_root .ewc-tab.on{background:var(--ewc-ink);border-color:var(--ewc-ink);color:#fff;font-weight:700}
#ewc_root .ewc-undo{display:flex;gap:10px;align-items:center;margin:0 0 10px;font-size:12.5px;color:var(--ewc-mut)}
#ewc_root .ewc-list{display:grid;gap:9px}
#ewc_root .ewc-item{border:1px solid var(--ewc-line2);border-left-width:4px;border-radius:9px;background:var(--ewc-paper2);padding:12px 14px}
#ewc_root .ewc-item.s3{border-left-color:var(--ewc-red)}
#ewc_root .ewc-item.s2{border-left-color:var(--ewc-warn)}
#ewc_root .ewc-item.s1{border-left-color:var(--ewc-navy)}
#ewc_root .ewc-item.focus{box-shadow:0 0 0 3px rgba(183,65,47,.25)}
#ewc_root .ewc-ihd{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:5px}
#ewc_root .ewc-sev{font-size:10.5px;font-weight:700;letter-spacing:.08em;border-radius:4px;padding:2px 7px;color:#fff}
#ewc_root .ewc-item.s3 .ewc-sev{background:var(--ewc-red)}
#ewc_root .ewc-item.s2 .ewc-sev{background:var(--ewc-warn)}
#ewc_root .ewc-item.s1 .ewc-sev{background:var(--ewc-navy)}
#ewc_root .ewc-iname{font-weight:700;font-size:14.5px}
#ewc_root .ewc-icat{font-size:11px;color:var(--ewc-mut)}
#ewc_root .ewc-idet{font-size:13px;margin:0 0 6px}
#ewc_root .ewc-ihits{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px}
#ewc_root .ewc-ihits code{font-family:var(--ewc-mono);font-size:12.5px;background:rgba(183,65,47,.08);border-radius:5px;padding:2px 7px;color:var(--ewc-ink)}
#ewc_root .ewc-ihits code b{color:var(--ewc-ok);font-weight:700}
#ewc_root .ewc-iwhy{font-size:12.5px;color:var(--ewc-mut);background:rgba(183,65,47,.05);border-radius:7px;padding:8px 10px;margin:0}
#ewc_root .ewc-iwhy b{color:var(--ewc-red)}
#ewc_root .ewc-iex{font-size:12.5px;color:var(--ewc-mut);margin:6px 0 0;font-family:Georgia,serif}
#ewc_root .ewc-iex b{color:var(--ewc-ink);font-weight:400;font-style:italic}
#ewc_root .ewc-ift{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:8px;align-items:center}
#ewc_root .ewc-fix{font-size:12px;font-weight:700;color:#fff;background:var(--ewc-ok);border-radius:99px;padding:5px 13px}
#ewc_root .ewc-fix:hover{filter:brightness(1.08)}
#ewc_root .ewc-flag,#ewc_root .ewc-quest{font-size:11px;color:var(--ewc-mut);border:1px solid var(--ewc-line2);border-radius:99px;padding:3px 9px;background:var(--ewc-paper2)}
#ewc_root .ewc-quest{color:var(--ewc-navy);text-decoration:none}
#ewc_root .ewc-flag:hover{border-color:var(--ewc-red);color:var(--ewc-red)}
#ewc_root .ewc-flag[disabled]{opacity:.7;cursor:default;border-style:dashed}
#ewc_root .ewc-empty{font-size:13px;color:var(--ewc-mut);border:1px dashed var(--ewc-line2);border-radius:9px;padding:16px;text-align:center}
#ewc_root .ewc-empty.ok{color:var(--ewc-ok);border-color:var(--ewc-ok);font-weight:700}

/* 次の一手・記録 */
#ewc_root .ewc-cta{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:11px}
#ewc_root .ewc-card{display:block;position:relative;border:1px solid var(--ewc-line2);border-radius:11px;background:var(--ewc-paper2);padding:14px 15px;transition:.15s;text-decoration:none}
#ewc_root .ewc-card:hover{border-color:var(--ewc-red);transform:translateY(-2px);box-shadow:0 8px 20px rgba(60,45,25,.10);text-decoration:none}
#ewc_root .ewc-card b{display:block;font-size:14.5px;color:var(--ewc-ink);margin-bottom:4px;padding-right:30px}
#ewc_root .ewc-card span{display:block;font-size:12px;color:var(--ewc-mut)}
#ewc_root .ewc-card i{display:block;font-style:normal;font-size:12px;color:var(--ewc-red);font-weight:700;margin-top:8px}
#ewc_root .ewc-card .ewc-pr{position:absolute;top:9px;right:10px;margin:0}
#ewc_root .ewc-hist{display:grid;gap:6px}
#ewc_root .ewc-hrow{display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:center;font-size:12.5px;color:var(--ewc-mut);border-bottom:1px dotted var(--ewc-line2);padding:7px 2px}
#ewc_root .ewc-hrow b{color:var(--ewc-ink);font-weight:700;font-variant-numeric:tabular-nums}
#ewc_root .ewc-hrow em{font-style:normal;font-weight:700;min-width:2.5em;text-align:right}
#ewc_root .ewc-hrow em.up{color:var(--ewc-ok)}
#ewc_root .ewc-hrow em.dn{color:var(--ewc-red)}
#ewc_root .ewc-foot{margin-top:22px;padding-top:16px;border-top:1px dashed var(--ewc-line2);font-size:12.5px;color:var(--ewc-mut);display:flex;gap:14px;flex-wrap:wrap;justify-content:space-between}
#ewc_root .ewc-foot small{display:block;font-size:11px;line-height:1.6;max-width:36em}
#ewc_root .ewc-footbtns{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-start}

/* お題ボックス・特別表示（要約の一致率など） */
#ewc_root .ewc-topicbox{border:1px solid var(--ewc-line2);border-radius:10px;background:rgba(255,255,255,.55);padding:12px 14px;margin:0 0 14px;display:grid;gap:10px}
#ewc_root .ewc-tb-hd{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
#ewc_root .ewc-tb-hd label{font-size:11.5px;letter-spacing:.1em;color:var(--ewc-mut);font-weight:700}
#ewc_root .ewc-small{padding:6px 13px;font-size:12.5px}
#ewc_root .ewc-set-tight{margin:0}
#ewc_root .ewc-set-tight:empty{display:none}
#ewc_root .ewc-tb-pr{font-size:12px;color:var(--ewc-mut)}
#ewc_root .ewc-special{display:grid;gap:10px;margin:0 0 12px}
#ewc_root .ewc-special:empty{display:none}
#ewc_root .ewc-sp{border:1px solid var(--ewc-line2);border-radius:10px;background:var(--ewc-paper2);padding:12px 14px;display:grid;grid-template-columns:auto 1fr;gap:6px 16px;align-items:center}
#ewc_root .ewc-sp b.big{font-size:34px;line-height:1;font-variant-numeric:tabular-nums;font-family:var(--ewc-mincho)}
#ewc_root .ewc-sp b.big small{font-size:14px;margin-left:2px}
#ewc_root .ewc-sp.c3 b.big{color:var(--ewc-red)}
#ewc_root .ewc-sp.c2 b.big{color:var(--ewc-warn)}
#ewc_root .ewc-sp.c1 b.big{color:var(--ewc-ok)}
#ewc_root .ewc-sp span{font-size:12.5px;color:var(--ewc-mut)}
#ewc_root .ewc-sp .ewc-sp-t{font-size:11.5px;letter-spacing:.1em;color:var(--ewc-mut);font-weight:700;grid-column:1/-1}
#ewc_root .ewc-sp .ewc-sp-pr{grid-column:1/-1;font-size:12px;color:var(--ewc-mut);border-top:1px dashed var(--ewc-line2);padding-top:6px}
#ewc_root .ewc-hl mark.ov{background:rgba(31,111,178,.10);border-bottom:2px dotted var(--ewc-navy)}

@media(min-width:900px){
 #ewc_root .ewc-two{grid-template-columns:1fr 1fr;gap:18px;align-items:start}
 #ewc_root .ewc-col-cards{position:sticky;top:0;max-height:none}
 #ewc_root .ewc-top{grid-template-columns:1fr auto;align-items:end}
}
@media(max-width:760px){
 #ewc_root{font-size:14.5px;border-radius:10px;margin:20px -4px}
 #ewc_root .ewc-pad{padding:18px 15px}
 #ewc_root .ewc-hd{padding:22px 15px 17px}
 #ewc_root .ewc-title{font-size:21px}
 #ewc_root textarea#ewc-ta{min-height:200px;font-size:16px}
 #ewc_root .ewc-go{width:100%;text-align:center}
 #ewc_root .ewc-ax{grid-template-columns:44px 1fr 60px}
 #ewc_root .ewc-hl{max-height:300px;font-size:15px}
 #ewc_root .ewc-timer{margin-left:0}
}
@media(prefers-color-scheme:dark){
 #ewc_root{--ewc-paper:#1b1915;--ewc-paper2:#232019;--ewc-line:#3a342a;--ewc-line2:#443d31;--ewc-ink:#efe9dd;--ewc-mut:#a3988a;--ewc-navy:#6fb0e8;--ewc-ok:#6dc396;--ewc-warn:#e0a44f;--ewc-red:#e0705a;box-shadow:0 10px 34px rgba(0,0,0,.4)}
 #ewc_root .ewc-hd{background:repeating-linear-gradient(90deg,transparent 0 31px,rgba(224,112,90,.10) 31px 32px),linear-gradient(180deg,#232019 0%,#1b1915 100%)}
 #ewc_root .ewc-res{background:linear-gradient(180deg,#201d18,#1b1915)}
 #ewc_root .ewc-bar,#ewc_root .ewc-ax i{background:#3a342a}
 #ewc_root .ewc-tab.on{background:var(--ewc-red);border-color:var(--ewc-red);color:#1b1915}
 #ewc_root .ewc-fix{color:#1b1915}
}
@media print{
 html,body{background:#fff!important}
 #ewc_root{background:#fff!important;color:#000!important;border:0!important;box-shadow:none!important;margin:0!important;font-size:10.5pt}
 #ewc_root *{background-image:none!important;box-shadow:none!important}
 #ewc_root .ewc-noprint,#ewc_root .ewc-hd .ewc-note{display:none!important}
 #ewc_root .ewc-hl{max-height:none!important;overflow:visible!important}
 #ewc_root .ewc-hl mark{background:#fff!important;border-bottom:2px solid #000!important}
 #ewc_root .ewc-sev{background:#fff!important;color:#000!important;border:1px solid #000!important}
}</style><div class="ewc-hd">
<p class="ewc-eyebrow">BUNKEI LAB / WRITING CHECK</p><div class="ewc-title" role="heading" aria-level="2">英作文セルフチェッカー</div><p class="ewc-lead">英検®ライティングと大学入試の英作文を、提出前に自分で点検できます。語数・形式・文法・語彙の基本ミスをその場で直せます。</p>
<p class="ewc-note">このツールが見るのは<strong>形式・文法・語彙の基本ミス</strong>です。内容の良し悪しや表現の自然さは判定しません。英検®のスコアや CSE スコアも推定しません。書いた英文は、お使いの端末の中だけで処理され、<strong>サーバーには送信しません</strong>。ツール改善のため、試験・級・形式と点数、「どの指摘が出たか」の項目だけを匿名で記録しています。<br><span class="ewc-count" id="ewc-count"></span></p>
</div>

<div class="ewc-pad ewc-noprint">
<div class="ewc-teach ewc-hide" id="ewc-teach"></div>
<div class="ewc-set" role="group" aria-label="試験の設定">
<div class="ewc-f"><label for="ewc-exam">試験</label><select id="ewc-exam" aria-label="試験"><option value="eiken">英検®</option><option value="univ">大学入試</option><option value="practice">自由練習（英文チェックのみ）</option></select></div>
<div class="ewc-f" id="ewc-f-grade"><label for="ewc-grade">級</label><select id="ewc-grade" aria-label="級"></select></div>
<div class="ewc-f" id="ewc-f-type"><label for="ewc-type">問題形式</label><select id="ewc-type" aria-label="問題形式"></select></div>
<div class="ewc-f ewc-f-range"><label>語数の目安</label><div class="ewc-range" id="ewc-range">—</div></div>
</div>
<div class="ewc-topicbox" id="ewc-topicbox">
<div class="ewc-tb-hd"><label id="ewc-topic-label" for="ewc-topic">お題（TOPIC / QUESTION）</label><button type="button" class="ewc-sub ewc-small" id="ewc-random">お題をランダムに出す</button></div>
<div class="ewc-f" id="ewc-f-topic"><textarea id="ewc-topic" rows="2" placeholder="例：Some people say that students should do volunteer work. Do you agree with this opinion?" spellcheck="false" aria-label="お題"></textarea></div>
<div class="ewc-f ewc-hide" id="ewc-f-src"><label id="ewc-src-label" for="ewc-src">原文</label><textarea id="ewc-src" rows="5" spellcheck="false" placeholder=""></textarea><span class="ewc-hint" id="ewc-src-hint"></span></div>
<div class="ewc-set ewc-set-tight">
<div class="ewc-f ewc-hide" id="ewc-f-name"><label for="ewc-name">相手の名前（Hi, ◯◯! の部分）</label><input id="ewc-name" type="text" placeholder="例：Alex" spellcheck="false"></div>
<div class="ewc-f ewc-hide" id="ewc-f-points"><label for="ewc-points">POINTS（カンマ区切り）</label><input id="ewc-points" type="text" placeholder="例：Cost, Health, Environment" spellcheck="false"></div>
</div>
<div class="ewc-tb-pr ewc-hide" id="ewc-topic-pr"></div>
</div>
<details class="ewc-details" id="ewc-details"><summary>詳細設定（語数の上書き）</summary>
<div class="ewc-set">
<div class="ewc-f"><label for="ewc-wmin">語数の上書き</label><div class="ewc-inline"><input id="ewc-wmin" type="number" min="0" max="1000" inputmode="numeric" aria-label="語数の下限"><span>〜</span><input id="ewc-wmax" type="number" min="0" max="1000" inputmode="numeric" aria-label="語数の上限"><span>語</span></div><span class="ewc-hint">空欄なら級の目安を使います。大学入試は志望校の指定に合わせて入力します</span></div>
</div></details>
<div class="ewc-tawrap"><textarea id="ewc-ta" placeholder="ここに英文を書くか、貼りつけてください。" spellcheck="false" autocorrect="off" autocapitalize="off" autocomplete="off" aria-label="英文の入力欄"></textarea></div>
<div class="ewc-meter"><div class="ewc-wc" id="ewc-wc" aria-live="polite">0 語</div><div class="ewc-bar" id="ewc-bar"><i></i><u id="ewc-mlo"></u><u id="ewc-mhi"></u></div><button type="button" class="ewc-link" id="ewc-howcount" aria-expanded="false">語数の数え方</button><div class="ewc-timer" id="ewc-timer"></div></div>
<div class="ewc-howcount ewc-hide" id="ewc-howcount-box">本ツールの数え方です（英検®の公式な数え方ではありません）。空白で区切られたまとまりを1語と数えます。短縮形（don't）、ハイフンでつないだ語（well-known）、数字（2024、20%）はそれぞれ1語です。単独の記号は数えません。Eメール問題で解答用紙に印刷済みの挨拶と結びは数えません。</div>
<div class="ewc-btns"><button type="button" class="ewc-go" id="ewc-run" disabled>チェックする</button><button type="button" class="ewc-sub" id="ewc-sample">サンプルで試す</button><button type="button" class="ewc-sub" id="ewc-clear">消す</button><button type="button" class="ewc-sub ewc-hide" id="ewc-share">この条件のURLをコピー</button><span class="ewc-status" id="ewc-status" aria-live="polite"></span></div>
<div class="ewc-hand ewc-hide" id="ewc-hand"></div>
</div>

<div class="ewc-res ewc-hide" id="ewc-res"><div class="ewc-pad">
<div class="ewc-band ewc-hide" id="ewc-band" role="alert"></div>
<div class="ewc-special" id="ewc-special"></div>
<div class="ewc-top">
<div class="ewc-axes" id="ewc-axes"></div>
<div class="ewc-diff" id="ewc-diff"></div>
</div>

<div class="ewc-two">
<div class="ewc-col-text">
<div class="ewc-h2" role="heading" aria-level="3">本文（下線を押すと指摘カードが開きます）</div>
<div class="ewc-hl" id="ewc-hl" tabindex="0"></div>
<div class="ewc-legend"><span class="l3">重大</span><span class="l2">注意</span><span class="l1">参考</span></div>
<div class="ewc-nums" id="ewc-nums"></div>
</div>
<div class="ewc-col-cards">
<div class="ewc-h2" role="heading" aria-level="3">指摘</div>
<div class="ewc-tabs ewc-noprint" id="ewc-tabs" role="tablist"><button type="button" class="ewc-tab on" data-f="all" role="tab">すべて</button><button type="button" class="ewc-tab" data-f="3" role="tab">重大</button><button type="button" class="ewc-tab" data-f="2" role="tab">注意</button><button type="button" class="ewc-tab" data-f="1" role="tab">参考</button></div>
<div class="ewc-undo ewc-noprint ewc-hide" id="ewc-undo"><button type="button" class="ewc-sub" id="ewc-undo-btn">元に戻す</button><span id="ewc-undo-msg"></span></div>
<div class="ewc-list" id="ewc-list"></div>
</div>
</div>

<div id="ewc-sec-next" class="ewc-noprint"><div class="ewc-h2" role="heading" aria-level="3">次の一手</div>
<div class="ewc-cta" id="ewc-cta"></div></div>

<div id="ewc-sec-hist"><div class="ewc-h2" role="heading" aria-level="3">これまでの記録</div>
<div class="ewc-hist" id="ewc-hist"></div></div>

<div class="ewc-foot"><div id="ewc-footlink"></div><div class="ewc-noprint ewc-footbtns"><button type="button" class="ewc-sub" id="ewc-print">印刷・PDF保存</button><button type="button" class="ewc-sub" id="ewc-copy">指摘をコピー</button></div></div>
</div></div><script>/* ============================================================
 *  英作文セルフチェッカー 判定エンジン  engine/checker.js
 *  - DOM にも WordPress にも依存しない。Node.js とブラウザで同じコードが動く。
 *  - 使い方:
 *      var eng = EWC_ENGINE.create({ rules: rulesJson, dict: dictJson, nlp: compromiseOrNull });
 *      var r   = eng.check(text, { format: '2O', words: [80,100], topic: '', points: [] });
 *      var t2  = eng.applyFix(text, r.findings[0].hits);
 *  - 同じ入力なら必ず同じ結果を返す（乱数・時刻・外部APIを使わない）。
 * ========================================================== */
(function (root, factory) {
  if (typeof module === 'object' && module.exports) { module.exports = factory(); }
  else { root.EWC_ENGINE = factory(); }
})(typeof self !== 'undefined' ? self : this, function () {
  'use strict';

  var VER = '1.0';

  /* ---------- 文字列ユーティリティ ---------- */
  function normalize(t) {
    return String(t == null ? '' : t)
      .replace(/\r\n?/g, '\n')
      .replace(/[‘’ʼ]/g, "'")
      .replace(/[“”]/g, '"')
      .replace(/ /g, ' ');
  }
  function esc(s) { return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }
  function cap(s) { return s ? s.charAt(0).toUpperCase() + s.slice(1) : s; }
  function isUpper(c) { return c >= 'A' && c <= 'Z'; }
  function keepCase(src, rep) { return isUpper(src.charAt(0)) ? cap(rep) : rep; }

  /* "..." の中を同じ長さの空白にする（位置がずれない） */
  function maskQuotes(t) {
    var o = '', inq = false, i, c;
    for (i = 0; i < t.length; i++) {
      c = t.charAt(i);
      if (c === '"') { inq = !inq; o += c; continue; }
      o += (inq && c !== '\n') ? ' ' : c;
    }
    return o;
  }

  /* 語（英検の数え方に合わせた本ツールの扱い：短縮形・ハイフン語・数字は1語） */
  var WORD_RE = /[A-Za-z0-9À-ɏ]+(?:['\-.][A-Za-z0-9À-ɏ]+)*/g;
  function tokens(t) {
    var out = [], m, re = new RegExp(WORD_RE.source, 'g');
    while ((m = re.exec(t)) !== null) {
      out.push({ s: m.index, e: m.index + m[0].length, w: m[0], l: m[0].toLowerCase() });
    }
    return out;
  }
  function wordCount(t) { return tokens(normalize(t)).length; }
  /* Eメール問題：解答用紙に印刷済みの挨拶（Hi, ◯◯! / Thank you for your e-mail.）と結び（Best wishes, / 名前）を見つける。
     同じ行に本文が続いていても、挨拶の文だけを切り出す */
  var G1 = /^(\s*)((?:hi|hello|hey|dear)\b[^.!?\n]{0,40}[.!,]?)/i;
  var G2 = /^(\s*)((?:thank you|thanks)(?: very much| so much)? for (?:your|the) (?:e-?mail|letter|message|reply)[.!]?)/i;
  var C1 = /(?:^|\n)[ \t]*([A-Z][a-z]+(?:[ \t]+[A-Z][a-z]+)?)[ \t]*$/;
  var C2 = /(?:^|\n|[.!?][ \t]*)((?:best wishes|best regards|kind regards|warm regards|regards|sincerely|sincerely yours|yours sincerely|yours truly|your friend|yours|bye|bye for now|see you|see you soon|take care|love|cheers|talk to you soon|write back soon|good luck)[,.!]*)\s*$/i;
  function emailParts(t) {
    var out = { greet: [], close: [] }, pos = 0, i, m;
    for (i = 0; i < 2; i++) {
      var rest = t.slice(pos);
      m = G1.exec(rest) || G2.exec(rest);
      if (!m) break;
      out.greet.push({ s: pos + m[1].length, e: pos + m[0].length, t: m[2] });
      pos += m[0].length;
    }
    var endT = t, cut = t.length;
    m = C1.exec(endT.replace(/\s+$/, ''));
    if (m && tokens(m[1]).length <= 2 && out.greet.every(function (g) { return g.e <= m.index; })) { var st = m.index + m[0].indexOf(m[1]); out.close.unshift({ s: st, e: st + m[1].length, t: m[1] }); cut = m.index; }
    endT = t.slice(0, cut).replace(/\s+$/, '');
    m = C2.exec(endT);
    if (m && out.greet.every(function (g) { return g.e <= m.index + m[0].indexOf(m[1]); })) { var st2 = m.index + m[0].indexOf(m[1]); out.close.unshift({ s: st2, e: st2 + m[1].length, t: m[1] }); }
    return out;
  }
  /* 形式に合わせた語数（Eメールでは印刷済みの部分を数えない） */
  function countWords(t, type) {
    t = normalize(t);
    var toks = tokens(t);
    if (type !== 'email') return toks.length;
    var parts = emailParts(t), ex = parts.greet.concat(parts.close), n = 0, i, j;
    for (i = 0; i < toks.length; i++) { var inside = false; for (j = 0; j < ex.length; j++) if (toks[i].s >= ex[j].s && toks[i].e <= ex[j].e) { inside = true; break; } if (!inside) n++; }
    return n;
  }
  /* 要約：原文と4語以上連続で一致する部分 */
  function overlapRuns(toks, srcText, k) {
    k = k || 4;
    var st = tokens(srcText), set = {}, i, j, covered = [], runs = [];
    for (i = 0; i + k <= st.length; i++) { var g = []; for (j = 0; j < k; j++) g.push(st[i + j].l); set[g.join(' ')] = 1; }
    for (i = 0; i < toks.length; i++) covered.push(false);
    for (i = 0; i + k <= toks.length; i++) { var h = []; for (j = 0; j < k; j++) h.push(toks[i + j].l); if (set[h.join(' ')]) for (j = 0; j < k; j++) covered[i + j] = true; }
    var n = 0, start = -1;
    for (i = 0; i <= toks.length; i++) {
      var on = i < toks.length && covered[i];
      if (on) { n++; if (start < 0) start = i; }
      else if (start >= 0) { runs.push({ s: toks[start].s, e: toks[i - 1].e, t: '' }); start = -1; }
    }
    return { covered: n, total: toks.length, pct: toks.length ? Math.round(n / toks.length * 100) : 0, runs: runs };
  }
  /* 和文英訳：日本語の文の数と数字 */
  var KNUM = { '〇': 0, '零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9 };
  function kanjiToNum(str) {
    var total = 0, sec = 0, num = 0, i, c, units = { '十': 10, '百': 100, '千': 1000 };
    for (i = 0; i < str.length; i++) {
      c = str.charAt(i);
      if (KNUM[c] != null) num = num * 10 + KNUM[c];
      else if (units[c]) { sec += (num || 1) * units[c]; num = 0; }
      else if (c === '万') { total += (sec + (num || (sec ? 0 : 1))) * 10000; sec = 0; num = 0; }
      else if (c === '億') { total += (sec + num) * 100000000; sec = 0; num = 0; }
    }
    return total + sec + num;
  }
  function jpNumbers(jp) {
    var out = [], m, re1 = /[0-9０-９]+(?:[.．][0-9０-９]+)?/g, re2 = /[〇零一二三四五六七八九十百千万億]+/g;
    while ((m = re1.exec(jp)) !== null) { var v = m[0].replace(/[０-９]/g, function (d) { return String.fromCharCode(d.charCodeAt(0) - 0xFEE0); }).replace('．', '.'); out.push(parseFloat(v)); }
    while ((m = re2.exec(jp)) !== null) {
      var w = m[0];
      if (/^[一二三四五六七八九十百千万億〇零]$/.test(w) && /^(一|二|三|四|五|六|七|八|九|十|百|千|万)$/.test(w)) {
        /* 一人・一つ・一番 などの「一」は数として数えない。二以上は数える */
        var after = jp.charAt(m.index + 1);
        if (w === '一' && /[人つ番般部緒方度日目応番的時所面切体員層]/.test(after)) continue;
        if (/[番般部緒方目的応切層]/.test(after)) continue;
      }
      out.push(kanjiToNum(w));
    }
    return out;
  }
  var ENUM = { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10, eleven: 11, twelve: 12, thirteen: 13, fourteen: 14, fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18, nineteen: 19, twenty: 20, thirty: 30, forty: 40, fifty: 50, sixty: 60, seventy: 70, eighty: 80, ninety: 90, hundred: 100, thousand: 1000, million: 1000000, billion: 1000000000, half: 0.5, dozen: 12 };
  function enNumbers(t) {
    var out = [], toks = tokens(t), i, cur = null, prev = 0, gm, gre = /\d{1,3}(?:,\d{3})+/g;
    while ((gm = gre.exec(t)) !== null) out.push(parseInt(gm[0].replace(/,/g, ''), 10));
    for (i = 0; i < toks.length; i++) {
      var w = toks[i].l, parts = w.split('-'), val = null;
      if (/^[0-9]+(?:\.[0-9]+)?$/.test(w.replace(/,/g, ''))) { out.push(parseFloat(w.replace(/,/g, ''))); continue; }
      if (parts.length === 2 && ENUM[parts[0]] != null && ENUM[parts[1]] != null) val = ENUM[parts[0]] + ENUM[parts[1]];
      else if (ENUM[w] != null) val = ENUM[w];
      if (val == null) { if (cur != null) out.push(cur); cur = null; continue; }
      if (cur == null) cur = val;
      else if (val >= 100) cur = cur * val;
      else cur = cur + val;
    }
    if (cur != null) out.push(cur);
    return out;
  }

  /* 文：. ! ? のあと、または改行で切る */
  function sentences(t) {
    var out = [], i, st = 0, c, n = t.length;
    function push(s, e, noend) {
      var seg = t.slice(s, e);
      if (seg.replace(/\s/g, '')) {
        var ls = s; while (ls < e && /\s/.test(t.charAt(ls))) ls++;
        var le = e; while (le > ls && /\s/.test(t.charAt(le - 1))) le--;
        out.push({ s: ls, e: le, t: t.slice(ls, le), noend: !!noend });
      }
    }
    for (i = 0; i < n; i++) {
      c = t.charAt(i);
      if (c === '.' || c === '!' || c === '?') {
        /* 略語や小数の途中では切らない（e.g. / 3.5 / U.S.） */
        var nx = t.charAt(i + 1), pv = t.charAt(i - 1);
        if (c === '.' && (/[0-9]/.test(nx) || (/[A-Za-z]/.test(nx) && /[A-Za-z]/.test(pv) && !/[a-z]{3,}$/.test(t.slice(Math.max(0, i - 3), i))))) continue;
        while (i + 1 < n && /[.!?]/.test(t.charAt(i + 1))) i++;
        while (i + 1 < n && /["')\]]/.test(t.charAt(i + 1))) i++;
        push(st, i + 1, false); st = i + 1;
      } else if (c === '\n') {
        push(st, i, true); st = i + 1;
      }
    }
    push(st, n, true);
    return out;
  }
  function paragraphs(t) {
    var a = t.split(/\n+/), o = [];
    for (var i = 0; i < a.length; i++) if (a[i].replace(/\s/g, '')) o.push(a[i]);
    return o;
  }
  function sentTokens(sent, toks) {
    var o = [];
    for (var i = 0; i < toks.length; i++) if (toks[i].s >= sent.s && toks[i].e <= sent.e) o.push(toks[i]);
    return o;
  }

  /* ---------- 語形の変化 ---------- */
  var IRREG_3S = { have: 'has', do: 'does', go: 'goes', be: 'is' };
  function to3s(v) {
    var l = v.toLowerCase();
    if (IRREG_3S[l]) return IRREG_3S[l];
    if (/(s|x|z|ch|sh|o)$/.test(l)) return l + 'es';
    if (/[^aeiou]y$/.test(l)) return l.slice(0, -1) + 'ies';
    return l + 's';
  }
  function from3s(v) {
    var l = v.toLowerCase();
    var inv = { has: 'have', does: 'do', goes: 'go', is: 'be' };
    if (inv[l]) return inv[l];
    if (/ies$/.test(l)) return l.slice(0, -3) + 'y';
    if (/(ss|x|z|ch|sh|o)es$/.test(l)) return l.slice(0, -2);
    if (/s$/.test(l)) return l.slice(0, -1);
    return l;
  }
  function toIng(v) {
    var l = v.toLowerCase();
    var sp = { be: 'being', see: 'seeing', die: 'dying', lie: 'lying', tie: 'tying', agree: 'agreeing', free: 'freeing' };
    if (sp[l]) return sp[l];
    if (/ie$/.test(l)) return l.slice(0, -2) + 'ying';
    if (/[^e]e$/.test(l) && !/ee$/.test(l)) return l.slice(0, -1) + 'ing';
    if (/^[a-z]*[^aeiou][aeiou][bdgklmnprstv]$/.test(l) && !/[wxy]$/.test(l) && l.length <= 5 && !/^(open|visit|enter|listen|offer|order|answer|happen|suffer|travel|cover|develop|limit)$/.test(l)) return l + l.slice(-1) + 'ing';
    return l + 'ing';
  }
  var IRREG_PAST = { went: 'go', came: 'come', saw: 'see', took: 'take', made: 'make', got: 'get', had: 'have', did: 'do', said: 'say',
    thought: 'think', bought: 'buy', brought: 'bring', taught: 'teach', felt: 'feel', found: 'find', gave: 'give', knew: 'know', ran: 'run',
    ate: 'eat', wrote: 'write', spoke: 'speak', told: 'tell', became: 'become', began: 'begin', left: 'leave', lost: 'lose', met: 'meet',
    paid: 'pay', sent: 'send', spent: 'spend', stood: 'stand', understood: 'understand', won: 'win', wore: 'wear', grew: 'grow', drove: 'drive',
    chose: 'choose', forgot: 'forget', kept: 'keep', built: 'build', sold: 'sell', held: 'hold', sat: 'sit', slept: 'sleep', threw: 'throw',
    caught: 'catch', led: 'lead', read: 'read', rode: 'ride', flew: 'fly', swam: 'swim', drank: 'drink', sang: 'sing', woke: 'wake', broke: 'break' };
  function fromPast(v) {
    var l = v.toLowerCase();
    if (IRREG_PAST[l]) return IRREG_PAST[l];
    if (/ied$/.test(l)) return l.slice(0, -3) + 'y';
    if (/[^aeiou]ed$/.test(l)) {
      var b = l.slice(0, -2);
      if (/([bdgklmnprstv])\1$/.test(b)) return b.slice(0, -1);
      if (/[^aeiou][aeiou][bdgklmnprstv]$/.test(b) && /^(us|hop|stop|plan|drop|shop|refer|prefer|admit|permit|occur|control)$/.test(b)) return b;
      if (/(at|it|iv|iz|ir|ur|ag|ak|ov|ic|uc|ud|as|os|ut|ap|ip|ep)$/.test(b) && !/[^aeiou][^aeiou]$/.test(b) && b.length > 3) return b + 'e';
      return b;
    }
    if (/ed$/.test(l)) return l.slice(0, -1);
    return l;
  }

  /* 辞書の置換文字列にある {ing:go} {cmp:easy} {ed:exciting} {pl:reason} {sg:doctors} {sg3:are} {y:d} を展開する */
  function toCmp(a) {
    var l = a.toLowerCase();
    var irr = { good: 'better', bad: 'worse', far: 'farther', little: 'less', many: 'more', much: 'more' };
    if (irr[l]) return irr[l];
    if (/[^aeiou]y$/.test(l)) return l.slice(0, -1) + 'ier';
    if (/e$/.test(l)) return l + 'r';
    if (/^[a-z]*[^aeiou][aeiou][bdgmnpt]$/.test(l) && l.length <= 4) return l + l.slice(-1) + 'er';
    return l + 'er';
  }
  function toPl(n) {
    var l = n.toLowerCase();
    var irr = { person: 'people', people: 'people', child: 'children', man: 'men', woman: 'women', foot: 'feet', tooth: 'teeth', mouse: 'mice', life: 'lives', knife: 'knives' };
    if (irr[l]) return irr[l];
    if (/[^aeiou]y$/.test(l)) return l.slice(0, -1) + 'ies';
    if (/(s|x|z|ch|sh)$/.test(l)) return l + 'es';
    return l + 's';
  }
  function tpl(s) {
    if (s.indexOf('{') < 0) return s;
    return s.replace(/\{(ing|cmp|ed|pl|sg|sg3|y):([^}]*)\}/g, function (_, k, v) {
      var l = v.toLowerCase();
      if (k === 'ing') return toIng(v);
      if (k === 'cmp') return toCmp(v);
      if (k === 'ed') return l.replace(/ing$/, 'ed');
      if (k === 'pl') return toPl(v);
      if (k === 'sg') return l.replace(/ies$/, 'y').replace(/(ss)$/, '$1').replace(/([^s])s$/, '$1');
      if (k === 'sg3') return ({ are: 'is', were: 'was', have: 'has', "don't": "doesn't", 'do not': 'does not', do: 'does' })[l] || v;
      if (k === 'y') return l === 'd' ? 'ied' : (l === 's' ? 'ies' : 'y');
      return v;
    });
  }

  /* ---------- ルールの重大度・対象 ---------- */
  function rv(v, fmt) {
    if (v && typeof v === 'object' && !Array.isArray(v)) { return v[fmt] != null ? v[fmt] : (v['*'] != null ? v['*'] : 0); }
    return v == null ? 0 : v;
  }
  function ruleOn(r, fmt) {
    var on = r.on || ['*'], off = r.off || [];
    if (off.indexOf(fmt) >= 0) return false;
    if (on.indexOf('*') >= 0) return true;
    if (on.indexOf(fmt) >= 0) return true;
    /* グループ名 */
    var G = GROUPS[fmt] || [];
    for (var i = 0; i < G.length; i++) if (on.indexOf(G[i]) >= 0) return true;
    return false;
  }
  var GROUPS = {
    '3O': ['eiken', 'op'], 'P2O': ['eiken', 'op'], 'P2PO': ['eiken', 'op'], '2O': ['eiken', 'op'], 'P1O': ['eiken', 'op'],
    '3E': ['eiken', 'email'], 'P2E': ['eiken', 'email'],
    'P2PS': ['eiken', 'sum'], '2S': ['eiken', 'sum'], 'P1S': ['eiken', 'sum'],
    'UF': ['univ', 'free_essay'], 'UT': ['univ', 'trans'], 'FR': ['practice']
  };

  /* ============================================================
   *  エンジン本体
   * ========================================================== */
  function create(cfg) {
    cfg = cfg || {};
    var RULES = (cfg.rules && cfg.rules.rules) || [];
    var FORMATS = (cfg.rules && cfg.rules.formats) || {};
    var SCORING = (cfg.rules && cfg.rules.scoring) || {};
    var D = cfg.dict || {};
    var NLP = cfg.nlp || null;
    var RI = {};
    for (var i = 0; i < RULES.length; i++) RI[RULES[i].id] = RULES[i];

    function dictList(name) { return (D[name] || []); }
    function reCache() { var c = {}; return function (src, flags) { var k = flags + '|' + src; if (!c[k]) c[k] = new RegExp(src, flags); c[k].lastIndex = 0; return c[k]; }; }
    var RE = reCache();

    /* ---------- 1回のチェックの文脈 ---------- */
    function Ctx(text, opt) {
      this.t = text;
      this.tm = maskQuotes(text);
      this.opt = opt;
      this.fmt = opt.format || 'FR';
      this.F = FORMATS[this.fmt] || {};
      this.toks = tokens(text);
      this.mtoks = tokens(this.tm);
      this.S = sentences(text);
      this.P = paragraphs(text);
      this.n = this.toks.length;
      this.findings = [];
      this.hits = [];
      this.nlpDoc = null;
      this.extra = {};
      if (this.F.type === 'email') { this.email = emailParts(text); this.n = countWords(text, 'email'); }
    }
    Ctx.prototype.rule = function (id) { return RI[id]; };
    /* 指摘を積む。hits: [{s,e,t,fix,sev?,why?,good?}] */
    Ctx.prototype.add = function (r, hits, extra) {
      extra = extra || {};
      if (!hits || !hits.length) { if (extra.always) { this.findings.push(mk(r, [], extra, this.fmt)); } return; }
      /* 同じ場所を2つのパターンが拾ったときは1件にまとめる */
      var uniq = [], seenPos = {};
      for (var u = 0; u < hits.length; u++) { var key = hits[u].s + ':' + hits[u].e; if (hits[u].e > hits[u].s && seenPos[key]) continue; seenPos[key] = 1; uniq.push(hits[u]); }
      hits = uniq;
      var f = mk(r, hits, extra, this.fmt);
      if (!f.sev) return;
      this.findings.push(f);
      for (var i = 0; i < hits.length; i++) if (hits[i].e > hits[i].s) this.hits.push({ rid: r.id, sev: hits[i].sev || f.sev, s: hits[i].s, e: hits[i].e, wide: hits[i].wide ? 1 : 0 });
    };
    function mk(r, hits, extra, fmt) {
      var sev = extra.sev != null ? extra.sev : rv(r.sev, fmt), i;
      /* 箇所ごとに重大度が決まっているとき（例：限定詞つき名詞の不一致は注意）は、その最大値を指摘の重大度にする。
         ルールの重大度で上書きすると、箇所では「注意」なのに指摘全体が「重大」になってしまうため */
      var allHit = hits.length > 0 && extra.sev == null, hmax = 0;
      for (i = 0; i < hits.length; i++) { if (hits[i].sev == null) { allHit = false; break; } if (hits[i].sev > hmax) hmax = hits[i].sev; }
      if (allHit && sev) sev = Math.min(sev, hmax) || hmax;
      for (i = 0; i < hits.length; i++) if (hits[i].sev != null && hits[i].sev > sev) sev = hits[i].sev;
      var fixable = false;
      for (i = 0; i < hits.length; i++) if (hits[i].fix != null) fixable = true;
      return { id: r.id, ax: r.ax, cat: r.cat || '', sev: sev, name: r.name, why: extra.why || r.why || '', example: r.example || '',
        det: extra.det || '', n: hits.length, hits: hits, fixable: fixable, quest: r.quest || '', metric: extra.metric || null };
    }

    /* ---------- 検出の種類ごとの汎用処理 ---------- */
    function runRegex(r, C) {
      var d = r.detect, src = d.q === 0 ? C.t : C.tm, re = RE(d.re, d.ci === 0 ? 'g' : 'gi'), m, hits = [], cnt = 0;
      while ((m = re.exec(src)) !== null) {
        if (m[0].length === 0) { re.lastIndex++; continue; }
        var w = d.gi ? m[d.gi] : m[0]; if (!w) continue;
        var off = d.gi ? m.index + m[0].indexOf(w) : m.index;
        if (d.xb && off > 0 && RE(d.xb, '').test(src.charAt(off - 1))) continue;
        var h = { s: off, e: off + w.length, t: w };
        if (d.repl != null) h.fix = w.replace(RE(d.re, d.ci === 0 ? '' : 'i'), d.repl);
        hits.push(h); if (++cnt > 300) break;
      }
      if (hits.length >= (r.min || 1)) C.add(r, hits, { det: hits.length + 'か所' });
    }
    function runDict(r, C) {
      var list = dictList(r.detect.dict), hits = [], i, m, re;
      for (i = 0; i < list.length; i++) {
        var e = list[i];
        if (e.re) { re = RE(e.re, 'gi'); }
        else { re = RE('\\b' + esc(e.bad) + '\\b', 'gi'); }
        while ((m = re.exec(C.tm)) !== null) {
          if (!m[0].length) { re.lastIndex++; continue; }
          if (e.xpre && RE(e.xpre + '$', 'i').test(C.tm.slice(Math.max(0, m.index - 30), m.index))) continue;
          if (e.xpost && RE('^' + e.xpost, 'i').test(C.tm.slice(m.index + m[0].length, m.index + m[0].length + 30))) continue;
          var h = { s: m.index, e: m.index + m[0].length, t: m[0], sev: e.sev, why: e.why, good: e.good };
          if (e.fix === 0) { /* 指摘だけで修正案は出さない */ }
          else if (e.repl != null) h.fix = tpl(m[0].replace(RE(e.re, 'i'), e.repl));
          else if (e.good != null) h.fix = keepCase(m[0], e.good);
          hits.push(h);
        }
      }
      if (hits.length >= (r.min || 1)) {
        var why = hits[0].why || r.why;
        C.add(r, hits, { det: hits.length + 'か所', why: why });
      }
    }

    /* ---------- 個別ロジック（fn） ---------- */
    var VERBS = ['go', 'like', 'want', 'need', 'have', 'make', 'take', 'play', 'study', 'live', 'work', 'think', 'say', 'get', 'use', 'know', 'come', 'see', 'look', 'give',
      'help', 'try', 'feel', 'become', 'seem', 'learn', 'enjoy', 'watch', 'read', 'write', 'eat', 'buy', 'cost', 'mean', 'show', 'start', 'keep', 'let', 'put', 'find', 'tell', 'ask',
      'call', 'bring', 'teach', 'spend', 'lose', 'pay', 'run', 'walk', 'move', 'provide', 'allow', 'offer', 'cause', 'increase', 'decrease', 'improve', 'reduce', 'affect',
      'believe', 'hope', 'prefer', 'love', 'hate', 'care', 'happen', 'change', 'grow', 'stay', 'sleep', 'drive', 'ride', 'fly', 'swim', 'cook', 'clean', 'visit', 'travel', 'save',
      'waste', 'protect', 'support', 'agree', 'disagree', 'depend', 'belong', 'exist', 'matter', 'contain', 'include', 'require', 'produce', 'create', 'develop', 'build',
      'design', 'decide', 'choose', 'remember', 'forget', 'understand', 'consider', 'suggest', 'recommend', 'encourage', 'prevent', 'avoid', 'continue', 'finish', 'begin',
      'end', 'open', 'close', 'turn', 'follow', 'lead', 'join', 'share', 'send', 'receive', 'meet', 'talk', 'speak', 'listen', 'hear', 'wear', 'carry', 'hold', 'throw', 'catch',
      'win', 'fail', 'pass', 'miss', 'practice', 'perform', 'sing', 'dance', 'draw', 'paint', 'plant', 'order', 'serve', 'sell', 'rent', 'borrow', 'lend', 'own', 'earn', 'collect',
      'attend', 'participate', 'cheat', 'argue', 'complain', 'worry', 'relax', 'rest', 'exercise', 'die', 'hurt', 'break', 'fix', 'check', 'add', 'remove', 'search', 'explain',
      'describe', 'discuss', 'mention', 'claim', 'seem', 'appear', 'tend', 'expect', 'plan', 'wish', 'mind', 'stop', 'wait', 'return', 'arrive', 'leave', 'reach', 'enter',
      'answer', 'solve', 'face', 'suffer', 'benefit', 'gain', 'lack', 'bring', 'attract', 'communicate', 'connect', 'compete', 'cooperate', 'contribute', 'donate', 'exchange',
      'experience', 'express', 'focus', 'ignore', 'influence', 'invest', 'manage', 'notice', 'realize', 'recognize', 'reflect', 'respect', 'result', 'succeed', 'survive', 'waste'];
    var VSET = {}; for (var vi = 0; vi < VERBS.length; vi++) VSET[VERBS[vi]] = 1;
    var VS_SET = {}; for (var vj = 0; vj < VERBS.length; vj++) VS_SET[to3s(VERBS[vj])] = VERBS[vj];
    var ADV = '(?:also|often|always|usually|never|sometimes|really|still|just|already|even|rarely|seldom|now|then|actually|probably|only)';
    var CAUS = /\b(make|makes|made|making|let|lets|letting|help|helps|helped|helping|see|saw|seeing|hear|heard|hearing|watch|watched|watching|have|had|having|feel|felt|notice|noticed)\s+$/i;
    var SING_S = /^(news|asbestos|chaos|ethos|cosmos|kudos|bus|class|glass|boss|success|happiness|business|process|progress|stress|analysis|campus|focus|basis|status|series|species|physics|mathematics|economics|politics|ethics|athletics|gymnastics|virus|bonus|census|crisis|thesis|kindness|fitness|illness|weakness|darkness|sadness|loneliness|awareness|consciousness|gas|mass|grass|dress|address|access|princess|goddess|actress|waitress|chess|tennis|christmas|asparagus|lens|pass|loss|cross|mess|guess|kiss|miss|plus|us|this|yes|is|was|has|does|goes|always|sometimes|perhaps|thus|towards|besides|afterwards|whereas|unless|less|its|his|hers|ours|yours|theirs|thanks|means|headquarters|diabetes|measles|rabies|billiards|darts|dominoes|aerobics|linguistics|genetics|statistics|logistics|electronics|dynamics|mechanics|tactics|works|circus|canvas|atlas|cactus|octopus|genius|radius|nucleus|stimulus|syllabus|fungus|surplus|sinus|apparatus|caucus|chorus|walrus|hippopotamus|rhinoceros|anus|bias|alias|pancreas|oasis|emphasis|hypothesis|diagnosis|paralysis|synthesis|parenthesis|axis|iris|pelvis|tennis|penis|mantis|trellis|jeans|pants|shorts|clothes|glasses|scissors|trousers|pajamas|earnings|savings|surroundings|belongings|congratulations|outskirts|premises|remains|riches|goods|arms|customs|manners|thanks|regards|stairs|contents|proceeds)$/;
    var PLURAL_N = 'people|students|children|parents|teachers|friends|countries|companies|governments|schools|men|women|kids|adults|Japanese|families|cities|workers|boys|girls|things|animals|teenagers|young people|old people|elderly people|customers|users|players|citizens|tourists|scientists|doctors|experts|farmers|employees|humans|foreigners|neighbors|classmates|members|readers|writers|drivers|shoppers|visitors|residents';

    var FN = {};

    /* --- A: 語数 --- */
    FN.a_words_out = function (r, C) {
      var W = C.opt.words || C.F.words; if (!W) return;
      var n = C.n, lo = W[0], hi = W[1], edge = (SCORING['default'] && SCORING['default'].edge) || 5;
      if (n < lo - edge || n > hi + edge) {
        C.add(r, [{ s: 0, e: 0, t: '' }], { det: n + '語（範囲 ' + lo + '〜' + hi + '語）。' + (n < lo ? 'あと' + (lo - n) + '語必要です。' : (n - hi) + '語多すぎます。'), metric: { n: n, lo: lo, hi: hi } });
      }
    };
    FN.a_words_edge = function (r, C) {
      var W = C.opt.words || C.F.words; if (!W) return;
      var n = C.n, lo = W[0], hi = W[1], edge = (SCORING['default'] && SCORING['default'].edge) || 5;
      if ((n >= lo - edge && n < lo) || (n > hi && n <= hi + edge)) {
        C.add(r, [{ s: 0, e: 0, t: '' }], { det: n + '語（範囲 ' + lo + '〜' + hi + '語）。' + (n < lo ? 'あと' + (lo - n) + '語で範囲に入ります。' : (n - hi) + '語削ると範囲に入ります。') });
      }
    };
    /* --- A: タイトル行 --- */
    FN.a_title = function (r, C) {
      var lines = C.t.split('\n');
      if (lines.length < 2) return;
      var first = lines[0].trim();
      if (!first) return;
      var wc = tokens(first).length;
      if (wc >= 1 && wc <= 7 && !/[.!?]$/.test(first) && lines.slice(1).join('').replace(/\s/g, '')) {
        C.add(r, [{ s: 0, e: lines[0].length + 1, t: first, fix: '' }], { det: '「' + first + '」' });
      }
    };
    /* --- A: 意見論述の要素 --- */
    function firstSents(C, k) { var t = ''; for (var i = 0; i < C.S.length && i < k; i++) t += C.S[i].t + ' '; return t; }
    FN.a_op_stance = function (r, C) {
      if (!C.S.length) return;
      var head = firstSents(C, 2), list = D.stance || [];
      for (var i = 0; i < list.length; i++) if (RE('\\b' + list[i].replace(/ /g, '\\s+') + '\\b', 'i').test(head)) return;
      var s0 = C.S[0];
      C.add(r, [{ s: s0.s, e: s0.e, t: s0.t, wide: 1 }], { det: '最初の2文に「I think」「I agree」「should」などが見つかりません。' });
    };
    FN.a_op_reasons = function (r, C) {
      var list = D.reason_markers || [], found = {}, cnt = 0, i;
      for (i = 0; i < list.length; i++) {
        var m = list[i];
        if (RE('(^|[.!?]\\s+|\\n|,\\s*)' + m.replace(/ /g, '\\s+') + '\\b', 'i').test(C.tm)) { var key = m.replace(/^(the )?/, ''); if (!found[key]) { found[key] = 1; cnt++; } }
      }
      var need = C.F.reasons || 2;
      if (cnt < need) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '理由の標識が' + cnt + '種類しか見つかりません（First / Second / Also / In addition など）。', metric: { markers: cnt } });
    };
    FN.a_op_concl = function (r, C) {
      if (C.S.length < 3) return;
      var last = C.S[C.S.length - 1], prev = C.S[C.S.length - 2], txt = prev.t + ' ' + last.t, list = D.conclusion_markers || [];
      for (var i = 0; i < list.length; i++) if (RE('\\b' + list[i].replace(/ /g, '\\s+') + '\\b', 'i').test(txt)) return;
      C.add(r, [{ s: last.s, e: last.e, t: last.t, wide: 1 }], { det: '最後の文に「For these reasons」「Therefore」「That is why」などが見つかりません。' });
    };
    FN.a_op_points = function (r, C) {
      var pts = C.opt.points || []; if (!pts.length) return;
      var used = [], miss = [], i;
      for (i = 0; i < pts.length; i++) {
        var p = String(pts[i]).trim(); if (!p) continue;
        var stem = p.toLowerCase().replace(/(ity|ness|ment|tion|sion|ance|ence|ing|s|y)$/, '');
        if (stem.length < 4) stem = p.toLowerCase().slice(0, 4);
        (RE('\\b' + esc(stem), 'i').test(C.tm) ? used : miss).push(p);
      }
      var need = C.F.pointsNeed || 0;
      if (need ? used.length < need : used.length === 0) {
        C.add(r, [{ s: 0, e: 0, t: '' }], { det: 'POINTS のうち使われているのは ' + (used.length ? used.join(', ') : 'なし') + ' です。' + (need ? need + 'つ以上使う必要があります。' : '使わなくても構いませんが、使うと理由が立てやすくなります。'), metric: { used: used, miss: miss } });
      }
    };
    FN.a_p1_struct = function (r, C) {
      if (C.n < 20) return;
      if (C.P.length < 3) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '段落が' + C.P.length + 'つです。序論・本論・結論の3段落以上に分けます。' });
    };

    /* --- A: Eメール --- */
    FN.a_email_greet = function (r, C) {
      var g = (C.email && C.email.greet) || [], hits = [];
      for (var i = 0; i < g.length; i++) hits.push({ s: g[i].s, e: Math.min(C.t.length, g[i].e + 1), t: g[i].t.trim(), fix: '' });
      C.add(r, hits, { det: '解答欄に印刷済みの部分です。語数にも数えません。' });
    };
    FN.a_email_close = function (r, C) {
      var g = (C.email && C.email.close) || [], hits = [];
      for (var i = 0; i < g.length; i++) hits.push({ s: Math.max(0, g[i].s - 1), e: g[i].e, t: g[i].t.trim(), fix: '' });
      C.add(r, hits, { det: '「Best wishes,」は印刷済みで、名前も書く必要はありません。' });
    };
    FN.a_email_q2 = function (r, C) {
      var q = 0, hits = [], i, need = C.F.questions || 2;
      for (i = 0; i < C.S.length; i++) { var st = C.tm.slice(C.S[i].s, C.S[i].e); if (/\?\s*["')]*$/.test(st)) { q++; hits.push({ s: C.S[i].s, e: C.S[i].e, t: C.S[i].t, wide: 1 }); } }
      C.extra.questions = q;
      if (q === need) return;
      if (q < need) C.add(r, [{ s: 0, e: 0, t: '' }], { sev: 3, det: '疑問文が ' + q + ' つです。下線部について具体的な質問を ' + need + ' つ書きます（例：How much is it? / When did you go there?）。' });
      else C.add(r, hits, { sev: 2, det: '疑問文が ' + q + ' つあります。質問は ' + need + ' つにまとめます。' });
    };
    FN.a_email_ans = function (r, C) {
      var src = C.opt.source || ''; if (!src) return;
      var qs = [], S = sentences(normalize(src)), i, j;
      for (i = 0; i < S.length; i++) if (/\?\s*$/.test(S[i].t)) qs.push(S[i].t);
      if (!qs.length) return;
      var mine = {}; for (i = 0; i < C.mtoks.length; i++) mine[lemma(C.mtoks[i].w)] = 1;
      /* 質問の種類ごとに「答えらしい語」があるかも見る（where→場所、when→時、how did you get→交通手段、who→人） */
      var WH = [
        [/\b(?:which|what)\b[^?]*\b(?:like|love|enjoy)\b[^?]*\b(?:best|most)\b/i, /\b(liked?|love[ds]?|favou?rite|enjoy(?:ed)?|the best|the most)\b/i],
        [/\bwhat\s+is\s+(?:your|his|her|its)\b[^?]*\bname\b/i, /\b(name|named|call(?:ed)?)\b/i],
        [/\bwhat\s+did\s+you\s+do\b/i, /\b(went|played|visited|saw|watched|ate|made|helped|read|studied|swam|skied|walked|talked|enjoyed|climbed|cooked|bought|took|had|did|met|learned|listened|sang|danced|ran|rode|drove|stayed|slept|built|caught)\b/i],
        [/^\s*(?:and\s+)?where\b/i, /\b(at|in|near|to|on|from)\s+(?:the\s+|a\s+|my\s+|our\s+)?[A-Za-z]/i],
        [/^\s*(?:and\s+)?when\b/i, /\b(last|next|yesterday|today|tomorrow|ago|on|in|at|this|every)\s+\w+|\b(morning|afternoon|evening|night|weekend|birthday|christmas|o'clock|a\.m\.|p\.m\.|\d{1,2}(?::\d{2})?)\b/i],
        [/^\s*(?:and\s+)?how\s+(?:did|do|will|are|were|can|could)\s+you\s+(?:get|go|come|travel)\b/i, /\b(by\s+(?:a\s+|the\s+|my\s+)?(?:bus|train|car|bike|bicycle|subway|taxi|plane|boat|ship)|on\s+foot|walked|took\s+(?:a|the)\s+(?:bus|train|taxi)|drove|rode|flew)\b/i],
        [/^\s*(?:and\s+)?how\s+(?:long|many|much|often|old|far)\b/i, /\b(\d+|one|two|three|four|five|six|seven|eight|nine|ten|twenty|thirty|hundred|many|much|often|every|hours?|minutes?|days?|weeks?|months?|years?|times?|yen|dollars?)\b/i],
        [/^\s*(?:and\s+)?who\b/i, /\b(my|our|friend|friends|family|mother|father|mom|dad|brother|sister|teacher|classmate|cousin|grandmother|grandfather|uncle|aunt|with)\b/i],
        [/^\s*(?:and\s+)?(?:why|what\s+(?:did|do|will|are|were|kind|time)|which|do you|did you|are you|will you|have you|can you)\b/i, /./]
      ];
      var miss = [];
      for (i = 0; i < qs.length; i++) {
        var qt = tokens(qs[i]), keys = [], hit = false;
        for (j = 0; j < qt.length; j++) { var k = lemma(qt[j].w); if (STOPSET[k] || k.length < 4 || /^(what|when|where|which|who|whose|why|how|does|did|will|would|could|should|about|there|your|you|like|best|think|want|going|have)$/.test(k)) continue; keys.push(k); if (mine[k]) hit = true; }
        /* 質問の種類が分かるものは、その種類の答え方だけで判定する */
        var typed = false;
        for (j = 0; j < WH.length; j++) if (WH[j][0].test(qs[i])) { typed = true; hit = WH[j][1].test(C.t); break; }
        if (!hit && (typed || keys.length)) miss.push(qs[i]);
      }
      if (miss.length) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '返信に答えが見当たらない質問：' + miss.join(' ') + '　質問の語（場所・時・理由など）を使って答えます。', metric: { unanswered: miss.length, questions: qs.length } });
      C.extra.answered = qs.length - miss.length; C.extra.asked = qs.length;
    };
    /* --- A: 要約 --- */
    FN.a_sum_overlap = function (r, C) {
      var src = C.opt.source || ''; if (!src) return;
      var ov = overlapRuns(C.toks, src, 4), cfg = C.F.overlap || { warn: 30, crit: 50 };
      C.extra.overlap = ov.pct; C.extra.overlapRuns = ov.runs;
      var hits = [], i; for (i = 0; i < ov.runs.length; i++) hits.push({ s: ov.runs[i].s, e: ov.runs[i].e, t: C.t.slice(ov.runs[i].s, ov.runs[i].e), wide: 1 });
      if (ov.pct > cfg.crit) C.add(r, hits, { sev: 3, det: '原文と4語以上続けて一致する部分が ' + ov.pct + '％（目安 ' + cfg.warn + '％以下）。自分の言葉で言い換えます。', metric: { pct: ov.pct } });
      else if (ov.pct > cfg.warn) C.add(r, hits, { sev: 2, det: '原文と4語以上続けて一致する部分が ' + ov.pct + '％（目安 ' + cfg.warn + '％以下）。長い一致は言い換えます。', metric: { pct: ov.pct } });
    };
    FN.a_sum_opinion = function (r, C) {
      var list = D.opinion_markers || [], hits = [], i, m, re;
      for (i = 0; i < list.length; i++) { re = RE('\\b' + list[i].replace(/ /g, '\\s+') + '\\b', 'gi'); while ((m = re.exec(C.tm)) !== null) hits.push({ s: m.index, e: m.index + m[0].length, t: m[0], fix: '' }); }
      C.add(r, hits, { det: '要約では自分の意見や感想を書きません。原文の内容だけを短くまとめます。' });
    };
    FN.a_sum_copy = function (r, C) {
      var src = normalize(C.opt.source || ''); if (!src) return;
      var norm = function (x) { return tokens(x).map(function (t) { return t.l; }).join(' '); }, sn = ' ' + norm(src) + ' ', hits = [], i;
      for (i = 0; i < C.S.length; i++) { var st = C.S[i], tk = tokens(st.t); if (tk.length < 8) continue; if (sn.indexOf(' ' + norm(st.t) + ' ') >= 0) hits.push({ s: st.s, e: st.e, t: st.t, wide: 1 }); }
      C.add(r, hits, { det: hits.length + '文が原文と同じです。主語を変える、語を言い換える、2文を1文にまとめるなどして書き直します。' });
    };
    /* --- D: 構成・つなぎ --- */
    FN.s_connect = function (r, C) {
      var con = D.connectors || {}, counts = {}, total = 0, k, i, m, re;
      for (k in con) { counts[k] = 0; for (i = 0; i < con[k].length; i++) { re = RE('(^|[^a-z])' + con[k][i].replace(/ /g, '\\s+') + '(?![a-z])', 'gi'); while ((m = re.exec(C.tm)) !== null) { counts[k]++; total++; } } }
      C.extra.connectors = counts; C.extra.connectorsTotal = total;
      if (total > 0) return;
      C.add(r, [{ s: 0, e: 0, t: '' }], { sev: C.n >= (r.minWords || 50) ? 2 : 1, det: '接続表現（First / However / For example / Therefore など）が見つかりません。文と文の関係が見えるように入れます。' });
    };
    FN.s_and_but_so = function (r, C) {
      var hits = [], i, map = { and: 'In addition', but: 'However', so: 'Therefore' };
      for (i = 0; i < C.S.length; i++) {
        var m = /^(And|But|So)\b(,?)\s/.exec(C.S[i].t); if (!m) continue;
        var w = m[1].toLowerCase(); hits.push({ s: C.S[i].s, e: C.S[i].s + m[1].length + m[2].length, t: m[1] + m[2], fix: map[w] + ',' });
      }
      if (!hits.length) return;
      C.add(r, hits, { sev: hits.length >= 2 ? 2 : 1, det: hits.length + '文が And / But / So で始まっています。' });
    };
    FN.s_for_example = function (r, C) {
      var hits = [], i;
      for (i = 0; i < C.S.length; i++) {
        var t = C.S[i].t, m = /\b(for example|for instance)\b/i.exec(t); if (!m) continue;
        var after = tokens(t.slice(m.index + m[0].length)); var all = tokens(t).length;
        if (all <= (r.maxWords || 6) || after.length < 3) hits.push({ s: C.S[i].s, e: C.S[i].e, t: t, wide: 1 });
      }
      C.add(r, hits, { det: '「for example」の後に具体的な例（誰が・何を・どうした）が続いていません。' });
    };
    FN.s_etc = function (r, C) {
      var hits = [], i;
      for (i = 0; i < C.S.length; i++) {
        var t = C.S[i].t, m = /(,?\s*(?:etc\.?|and so on|and so forth|and things like that|or something))\s*[.!?]?\s*$/i.exec(t); if (!m) continue;
        var off = C.S[i].s + m.index; hits.push({ s: off, e: off + m[1].length, t: m[1].trim(), fix: '' });
      }
      C.add(r, hits, { det: '「etc.」「and so on」で文を終えると、例を最後まで挙げていない印象になります。具体例を2つか3つ並べて言い切ります。' });
    };
    FN.s_one_para = function (r, C) {
      if (C.n < (r.minWords || 80)) return;
      if (C.P.length <= 1) C.add(r, [{ s: 0, e: 0, t: '' }], { det: C.n + '語が1つの段落に入っています。序論・本論・結論、または理由ごとに段落を分けます。' });
    };
    /* --- E: 文の長さ --- */
    FN.r_long = function (r, C) {
      var hits = [], i, mx = r.maxWords || 35;
      for (i = 0; i < C.S.length; i++) { var n = sentTokens(C.S[i], C.toks).length; if (n > mx) hits.push({ s: C.S[i].s, e: C.S[i].e, t: n + '語', wide: 1 }); }
      C.add(r, hits, { det: hits.length + '文が' + mx + '語を超えています。2つに分けます。' });
    };
    FN.r_short_run = function (r, C) {
      var run = 0, best = 0, bs = -1, be = -1, i, cs = -1, sh = r.shortWords || 8, need = r.runLen || 4;
      for (i = 0; i < C.S.length; i++) {
        var n = sentTokens(C.S[i], C.toks).length;
        if (n <= sh && n > 0) { if (run === 0) cs = i; run++; if (run > best) { best = run; bs = cs; be = i; } } else run = 0;
      }
      if (best >= need) C.add(r, [{ s: C.S[bs].s, e: C.S[be].e, t: '', wide: 1 }], { det: sh + '語以下の短い文が' + best + '文続いています。2文を接続詞でつなぐと流れが出ます。' });
    };
    /* --- F: 和文英訳 --- */
    FN.t_sent_count = function (r, C) {
      var jp = String(C.opt.source || '').replace(/\s+/g, ''); if (!jp) return;
      var js = (jp.match(/[。！？!?]/g) || []).length; if (!/[。！？!?]$/.test(jp)) js++;
      C.extra.jpSentences = js;
      if (js !== C.S.length) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '日本語は' + js + '文、英文は' + C.S.length + '文です。1文を分けたりまとめたりするのは問題ありませんが、訳し漏れがないか確かめます。' });
    };
    FN.t_numbers = function (r, C) {
      var jp = String(C.opt.source || ''); if (!jp) return;
      var jn = jpNumbers(jp), en = enNumbers(C.t), miss = [], i;
      for (i = 0; i < jn.length; i++) { var v = jn[i], ok = false; for (var j = 0; j < en.length; j++) if (Math.abs(en[j] - v) < 1e-9) { ok = true; break; } if (!ok && miss.indexOf(v) < 0) miss.push(v); }
      C.extra.jpNumbers = jn.length; C.extra.missingNumbers = miss;
      if (miss.length) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '原文の数字 ' + miss.join(', ') + ' が英文に見当たりません。数字は減点されやすいので必ず入れます。' });
    };

    /* --- B: 文法 --- */
    FN.g_cap_start = function (r, C) {
      var hits = [];
      for (var i = 0; i < C.S.length; i++) {
        var s = C.S[i], m = /^["'(\s]*([a-z])/.exec(s.t);
        if (m && s.t.indexOf('"') !== 0) {
          var off = s.s + m[0].length - 1;
          if (m[1] === 'i' && !/[a-z]/i.test(s.t.charAt(m[0].length))) continue; /* 単独の i は g_cap_i が見る */
          if (C.tm.charAt(off) !== ' ') hits.push({ s: off, e: off + 1, t: m[1], fix: m[1].toUpperCase() });
        }
      }
      C.add(r, hits, { det: hits.length + '文' });
    };
    FN.g_cap_i = function (r, C) {
      var hits = [], re = /(^|[^A-Za-z'])i(?=(?:'m|'ve|'d|'ll)?\b)(?!\.[a-z])/g, m;
      while ((m = re.exec(C.tm)) !== null) { var off = m.index + m[1].length; hits.push({ s: off, e: off + 1, t: 'i', fix: 'I' }); }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_end_punct = function (r, C) {
      var hits = [];
      for (var i = 0; i < C.S.length; i++) {
        var s = C.S[i];
        if (s.noend && tokens(s.t).length >= 3 && !/[.!?]["')]?$/.test(s.t)) {
          var toks = sentTokens(s, C.toks), last = toks.length ? toks[toks.length - 1] : null;
          if (last) hits.push({ s: last.s, e: s.e, t: C.t.slice(last.s, s.e), fix: C.t.slice(last.s, s.e) + '.' });
        }
      }
      C.add(r, hits, { det: hits.length + '文' });
    };
    FN.g_space_punct = function (r, C) {
      var hits = [], m, re1 = /[A-Za-z0-9]( +)([,.!?;:])/g, re2 = /([,;:!?])(?=[A-Za-z])/g, re3 = /\.(?=[A-Z][a-z])/g, re4 = /[^\s\n]( {2,})[^\s]/g;
      while ((m = re1.exec(C.tm)) !== null) { var a = m.index + 1; hits.push({ s: a, e: a + m[1].length + 1, t: m[1] + m[2], fix: m[2] }); }
      while ((m = re2.exec(C.tm)) !== null) { hits.push({ s: m.index, e: m.index + 1, t: m[1], fix: m[1] + ' ' }); }
      while ((m = re3.exec(C.tm)) !== null) { hits.push({ s: m.index, e: m.index + 1, t: '.', fix: '. ' }); }
      while ((m = re4.exec(C.tm)) !== null) { var b = m.index + 1; hits.push({ s: b, e: b + m[1].length, t: m[1], fix: ' ' }); }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_fullwidth = function (r, C) {
      var hits = [], m, re = /[！-～　、。「」（）぀-ヿ一-鿿]+/g;
      var map = { '　': ' ', '、': ', ', '。': '. ', '「': '"', '」': '"', '（': '(', '）': ')' };
      while ((m = re.exec(C.t)) !== null) {
        var fx = '', ok = true;
        for (var i = 0; i < m[0].length; i++) {
          var ch = m[0].charAt(i), code = ch.charCodeAt(0);
          if (map[ch] != null) fx += map[ch];
          else if (code >= 0xFF01 && code <= 0xFF5E) fx += String.fromCharCode(code - 0xFEE0);
          else { ok = false; }
        }
        hits.push({ s: m.index, e: m.index + m[0].length, t: m[0], fix: ok ? fx : undefined, sev: ok ? undefined : 3 });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_3sg = function (r, C) {
      var hits = [], m, re = RE('\\b(he|she|it|this)\\s+(?:' + ADV + '\\s+)?([a-z]+)\\b', 'gi');
      while ((m = re.exec(C.tm)) !== null) {
        var subj = m[1].toLowerCase(), v = m[2].toLowerCase();
        if (!VSET[v]) continue;
        var before = C.tm.slice(Math.max(0, m.index - 12), m.index);
        var afterV = C.tm.slice(m.index + m[0].length, m.index + m[0].length + 12);
        if (/^\s+(is|are|was|were|has|have|had|will|can|could|should|would|may|might|does|do|did)\b/i.test(afterV)) continue; /* this share is … → 名詞 */
        if (CAUS.test(before)) continue;                     /* made it work / let it go */
        if (/\b(with|of|for|about|in|on|at|by|from|without|like|than|into|onto|upon|through|toward|towards|against|among|to)\s*$/i.test(before)) continue;   /* countries with it have … */
        if (subj === 'this') {
          var nextW = (afterV.match(/^\s+([a-z]+)/i) || [])[1] || '';
          if (VS_SET[nextW.toLowerCase()] || /^\s*([.,;:!?]|$)/.test(afterV) || /ed$/i.test(nextW) || /^(was|were|had|made|took|gave|taught|brought|showed|became|kept|left|led|meant|put|saw|found|told|thought|felt|got|went|came|began|grew|knew|wrote|will|would|can|could|should|may|might|must)$/i.test(nextW)) continue;               /* This experience makes … / reduce this waste. */
          if (!/(^|[.!?;:,]\s*|\b(?:and|but|because|so|that|when|if|although|while|since|as)\s+)$/i.test(C.tm.slice(Math.max(0, m.index - 12), m.index))) continue;  /* 文や節の頭の this だけを主語と見る */
        }
        if (/\b(to|will|can|could|should|would|must|may|might|did|do|does|not|n't)\s*$/i.test(before)) continue;
        var off = m.index + m[0].lastIndexOf(m[2]);
        hits.push({ s: off, e: off + m[2].length, t: m[2], fix: to3s(m[2]), sev: subj === 'this' ? 2 : 3 });
      }
      /* 単数名詞の主語は品詞判定があるときだけ（注意） */
      if (C.nlpDoc) {
        try {
          var seen = {};
          for (var q = 0; q < hits.length; q++) seen[hits[q].s] = 1;
          C.nlpDoc.match('#Singular #Verb').forEach(function (mt) {
            var terms = mt.terms().json({ offset: true }), tn = terms[0], tv = terms[1];
            if (!tn || !tv) return;
            var vt = tv.terms[0], nt = tn.terms[0];
            if (!vt.tags || vt.tags.indexOf('PresentTense') < 0 || vt.tags.indexOf('Copula') >= 0 || vt.tags.indexOf('Modal') >= 0 || vt.tags.indexOf('Auxiliary') >= 0) return;
            if (nt.tags.indexOf('Pronoun') >= 0 || nt.tags.indexOf('Plural') >= 0 || nt.tags.indexOf('Uncountable') >= 0) return;
            var vw = vt.text.toLowerCase();
            if (!VSET[vw] || /^(have|do|be)$/.test(vw)) return;
            var off2 = vt.offset ? vt.offset.start : (mt.offset ? mt.offset.start : -1);
            if (off2 < 0 || seen[off2]) return;
            var farPre = C.tm.slice(Math.max(0, off2 - 45), off2);
            if (/\b(let|lets|make|makes|made|help|helps|helped|see|saw|hear|heard|watch|watched|have|had)\s+(?:each|every|the|a|an|my|our|your|their|his|her|this|that)?\s*[a-z]*\s*$/i.test(farPre)) return; /* let each department choose */
            /* 名詞の直前に限定詞（the / a / this / my …）があるか、固有名詞のときだけ見る。
               "to help", "and help" のような、動詞の前に名詞が偶然並んだだけの並びは外す */
            var pre = C.tm.slice(Math.max(0, off2 - 40), off2);
            var nounPre = pre.replace(/\s*[A-Za-z]+\s*$/, '');
            if (/\b(to|will|can|could|should|would|must|may|might|did|do|does|not|n't|that|which|who|and|or|,)\s*$/i.test(nounPre)) return;
            var hasDet = /\b(the|a|an|this|that|his|her|its|my|our|your|their|each|every|one|no|another)\s*$/i.test(nounPre);
            var isProper = /^[A-Z][a-z]+$/.test(nt.text) && nt.tags.indexOf('ProperNoun') >= 0;
            if (!hasDet && !isProper) return;
            hits.push({ s: off2, e: off2 + vt.text.length, t: vt.text, fix: to3s(vt.text), sev: 2 });
          });
        } catch (e) { /* 品詞判定に失敗しても通常判定は残す */ }
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_3sg_over = function (r, C) {
      var hits = [], m, re = RE('\\b(I|you|we|they)\\s+(?:' + ADV + '\\s+)?([a-z]+s)\\b', 'gi');
      while ((m = re.exec(C.tm)) !== null) {
        var v = m[2].toLowerCase(); if (!VS_SET[v]) continue;
        var before = C.tm.slice(Math.max(0, m.index - 12), m.index);
        var off = m.index + m[0].lastIndexOf(m[2]);
        hits.push({ s: off, e: off + m[2].length, t: m[2], fix: VS_SET[v] });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_a_an = function (r, C) {
      var hits = [], m, re = /\b(a|an)\s+([A-Za-z][A-Za-z\-]*|[0-9]+)\b/gi, ex = D.an_exceptions || { an: [], a: [] };
      function isAn(w) {
        var l = w.toLowerCase();
        if (ex.an.indexOf(l) >= 0) return true;
        if (ex.a.indexOf(l) >= 0) return false;
        if (/^[0-9]+$/.test(l)) return /^(8|11|18|80|800|8000|11[0-9]|18[0-9]|8[0-9]{2,})$/.test(l);
        if (/^[A-Z]{2,}$/.test(w)) return /^[AEFHILMNORSX]/.test(w);
        if (/^(uni|use|usu|ute|eu|one|onc|ubi|uk|ura|uri|uto|uv)/.test(l)) return false;
        if (/^ho(ur|nest|nor|nour|neir)/.test(l) || /^heir/.test(l)) return true;
        return /^[aeiou]/.test(l);
      }
      while ((m = re.exec(C.tm)) !== null) {
        var art = m[1], w = m[2], need = isAn(w) ? 'an' : 'a';
        if (art.toLowerCase() !== need) hits.push({ s: m.index, e: m.index + art.length, t: art, fix: keepCase(art, need), good: need + ' ' + w });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    /* 節の頭から pos までの主語部分。主語の中心がその複数名詞ではない（前置詞句の中にある、動名詞や what 節が主語）なら true */
    var PREP_RE = /\b(of|for|from|with|by|in|on|at|about|among|between|without|like|than|into|across|around|through|under|over|near|toward|towards|during|after|before|including|such as)\b/i;
    var ING_NOUN = /^(nothing|something|everything|anything|morning|evening|building|buildings|thing|things|king|spring|string|ceiling|wedding|meeting|feeling|clothing|painting|ring|sibling|during|earring|beginning|ending|setting|opening|living|being)$/i;
    function clausePre(t, pos) {
      var from = Math.max(0, pos - 90), seg = t.slice(from, pos), best = -1, mm, re2 = /[.!?;:,]|\b(?:that|think|thinks|believe|believes|agree|agrees|feel|feels|know|say|says|said|hope|if|because|when|while|although|though|since|whether|so|than|and|but|or|is|are|was|were)\b/gi;
      while ((mm = re2.exec(seg)) !== null) best = mm.index + mm[0].length;
      return best < 0 ? seg : seg.slice(best);
    }
    var ING_ADJ = /^(cooking|swimming|shopping|running|training|parking|living|dining|sleeping|boarding|reading|writing|listening|speaking|teaching|recycling|camping|fishing|hiking|skiing|dancing|singing|walking|bowling|marketing|banking|housing|nursing|washing|drinking|smoking|waiting|operating|shipping|coaching|drawing|painting|gaming|streaming|climbing|cycling|jogging|boxing|racing|sailing|surfing|diving|skating|voting|driving|working|flying|visiting|leading|rising|growing|aging|ageing|increasing|existing|remaining|coming|following|missing|developing)$/i;
    function headElsewhere(pre) {
      var p = pre.replace(/^\s+/, '').replace(/^(?:a lot of|lots of|plenty of|a number of|a couple of|most of(?: the)?|some of(?: the)?|many of(?: the)?|all of(?: the)?|the majority of|a group of)\s+/i, '');
      if (PREP_RE.test(p)) return true;
      var mw = p.match(/^(?:the\s+|my\s+|our\s+|their\s+)?([a-z]+)\s*([a-z]*)/i) || [], w0 = mw[1], w1 = mw[2] || '';
      /* 動名詞の主語（keeping pets is）。ただし cooking clubs のように名詞の前に付く -ing は除く。後ろが限定詞なら動名詞 */
      if (w0 && /ing$/i.test(w0) && !ING_NOUN.test(w0) && (!ING_ADJ.test(w0) || /^(the|a|an|my|our|your|their|his|her|its|this|that|these|those|some|many|more|other|new|good|healthy)$/i.test(w1))) return true;
      if (/^what\b/i.test(p)) return true;
      return false;
    }
    var SUBJ_PRON = /^(they|there|we|you|these|those|i|he|she|it|who|which|what|people|many|all|both|some|others)$/i;
    FN.g_sv_agree = function (r, C) {
      var hits = [], m, re, P = PLURAL_N;
      var pats = [
        ['\\bthere\\s+(is|was|\'s)\\s+(?=(?:many|a lot of|lots of|some|several|two|three|four|five|few|a few|' + P + ')\\b)', function (mm) { return mm[1].toLowerCase() === 'was' ? 'there were' : 'there are'; }],
        ['\\b(?:many|most|some|a lot of|lots of|all|these|those|two|three|several|few|a few|most of the|some of the|many of the|more and more|more|fewer|other|many other|most other|young|old|japanese|american)\\s+(?:' + P + ')\\s+(is|was|has|thinks|likes|wants|needs|goes|does|says|uses|makes|lives|works|plays|studies|believes|feels|knows|gets|takes|comes|becomes|seems|enjoys|prefers|tends|eats|buys|spends|learns|reads|watches|speaks|thinks)\\b', null],
        ['\\b(?:' + P + ')\\s+who\\s+(is|was|has|thinks|likes|wants|needs|goes|does|says|uses|makes|lives|works|plays|studies|believes|feels|knows|gets|takes|comes|becomes|seems|enjoys|prefers|tends|eats|buys|spends|learns|reads|watches|speaks)\\b', null],
        ['\\b(?:my|his|her|the|this|that|our|your|their|a|an|each|every|one)\\s+(?!(?:children|people|men|women|police|staff|teeth|feet|mice|sheep|fish|cattle|media|data|two|three|few|many|several)\\b)([a-z]*[a-rt-z])\\s+(don\'t|do not|have|are|were)\\b(?!\\s+(?:been|to)\\b)', 'detsing'],
        ['\\b(?:many|most|some|all|these|those|several|few|a few|two|three|four|five|more|fewer|other|many other|most other|a lot of|lots of|most of the|some of the|many of the|more and more|young|old)\\s+([a-z]+(?:ies|es|s))\\s+(is|was|has|thinks|likes|wants|needs|goes|does|says|uses|makes|lives|works|plays|studies|believes|feels|knows|gets|takes|comes|becomes|seems|enjoys|prefers|tends|eats|buys|spends|learns|reads|watches|speaks|offers|helps|gives|costs|runs|shows|means|brings)\\b', 'qplur'],
        ['(?:^|[.!?]\\s+|,\\s+|\\b(?:and|but|because|so|that|when|if|although|while|since|think|believe|know|feel|say|said|hope)\\s+)(?:the\\s+|my\\s+|our\\s+|your\\s+|their\\s+|his\\s+|her\\s+|its\\s+|these\\s+|those\\s+)?(?:(?!of\\b|is\\b|are\\b|was\\b|were\\b|has\\b|have\\b|not\\b|very\\b|so\\b|too\\b|a\\b|an\\b|the\\b|this\\b|that\\b|it\\b|he\\b|she\\b|there\\b)[a-z]+\\s+)?([a-z]+(?:ies|es|s))\\s+(is|was|has)\\b', 'bplur'],
        ['\\b(?:' + P + ')\\s+(is|was|has|thinks|likes|wants|needs|goes|does|says|uses|makes|lives|works|plays|studies|believes|feels|knows|gets|takes|comes|becomes|seems|enjoys|prefers|tends)\\b', 'plur3'],
        ['\\b(?:everyone|everybody|each|nobody|no one|someone|somebody)\\s+(are|have|were|think|like|want|need|go|do|say|use|make|live|work|play|study|believe|feel|know|get|take|come|become|seem|enjoy|prefer|tend)\\b', 'sing'],
        ['\\b(he|she|it)\\s+(are|have|were|don\'t|do not)\\b', 'sing'],
        ['\\b(I)\\s+(is|are|has|were|doesn\'t|does not)\\b', 'I'],
        ['\\b(you|we|they)\\s+(is|has|was|doesn\'t|does not)\\b', 'plur']
      ];
      for (var i = 0; i < pats.length; i++) {
        re = RE(pats[i][0], 'gi');
        while ((m = re.exec(C.tm)) !== null) {
          var vb = m[1] || m[2], off, fix;
          if (typeof pats[i][1] === 'function') {
            /* There was a lot of snow / There is some water：量の語のあとが複数名詞でなければ単数で正しい */
            var qn = C.tm.slice(m.index + m[0].length).match(/^(a lot of|lots of|some)\s+([a-z]+)(?:\s+([a-z]+))?/i), plN = RE('^(?:' + P + ')$', 'i');
            if (qn && ![qn[2], qn[3] || ''].some(function (w) { return plN.test(w) || /[^su]s$/i.test(w); })) continue;
            off = m.index; fix = keepCase(m[0], pats[i][1](m)); hits.push({ s: off, e: off + m[0].length, t: m[0], fix: fix }); continue; }
          var vwl = (m[m.length - 1]).toLowerCase(); off = m.index + m[0].lastIndexOf(m[m.length - 1]);
          var kind = pats[i][1], preC = clausePre(C.tm, off), before12 = C.tm.slice(Math.max(0, m.index - 16), m.index);
          /* the gap between rich people and poor people is：between A and B の B は主語ではない */
          if ((kind === null || kind === 'qplur' || kind === 'bplur' || kind === 'plur3') && /\bbetween\s+[^.!?;:,]*?\band\s+[^.!?;:,]*$/i.test(C.tm.slice(Math.max(0, off - 90), off))) continue;
          /* 仮定法（If I were / I wish it were） */
          if (vwl === 'were' && (kind === 'I' || kind === 'sing') && /\b(if|wish|wished|as if|as though|even if|if only|suppose|imagine)\s+$/i.test(before12)) continue;
          /* 単数の動詞なのに主語の中心が別（動名詞・前置詞句・what 節） */
          if ((kind === null || kind === 'qplur' || kind === 'bplur' || kind === 'plur3') && headElsewhere(preC)) continue;
          /* What companies value most … is / Whether students … is：文頭が what・whether 節なら主語は単数 */
          if ((kind === null || kind === 'qplur' || kind === 'bplur' || kind === 'plur3') && /(^|[.!?]\s+)(?:in my opinion,\s*|i think\s+|i believe\s+)?(what|whether|how|why|whoever|whatever)\b[^.!?]*$/i.test(C.tm.slice(Math.max(0, m.index - 160), m.index))) continue;
          /* make someone feel / on each work */
          if (kind === 'sing' && (CAUS.test(before12) || /\b(on|in|at|for|of|with|to|from|about|by)\s+$/i.test(before12))) continue;
          if (kind === 'detsing') {
            var dw = (m[0].match(/^[a-z]+\s+([a-z]+)/i) || [])[1] || '';
            if (SUBJ_PRON.test(dw)) continue;                                                     /* that they are / that there are */
            if (/\band\b/i.test(preC) || /\b(?:and|or)\s+$/i.test(before12)) continue;          /* the mind and the body are（主語が2つ） */
            if (/\b(in|of|for|from|with|at|on|by|near|around|about|across|inside|outside)\s+$/i.test(before12)) continue;   /* roads in my town are */
          }
          if (pats[i][1] === 'sing') { fix = { are: 'is', have: 'has', were: 'was', "don't": "doesn't", 'do not': 'does not' }[vwl] || to3s(vwl); }
          else if (pats[i][1] === 'detsing') { fix = { "don't": "doesn't", 'do not': 'does not', have: 'has', are: 'is', were: 'was' }[vwl]; hits.push({ s: off, e: off + m[m.length - 1].length, t: m[m.length - 1], fix: fix, sev: 2 }); continue; }
          else if (pats[i][1] === 'plur3') {
            if (/\bof\s+(?:my|the|our|his|her|their|these|those|your|all|some|many|most)?\s*$/i.test(C.tm.slice(Math.max(0, m.index - 14), m.index))) continue;   /* one of my friends is */
            fix = { is: 'are', was: 'were', has: 'have' }[vwl] || from3s(vwl);
            hits.push({ s: off, e: off + m[m.length - 1].length, t: m[m.length - 1], fix: fix }); continue;
          }
          else if (pats[i][1] === 'qplur' || pats[i][1] === 'bplur') {
            var noun = m[1], nl = noun.toLowerCase(), preTxt = C.tm.slice(Math.max(0, m.index - 6), m.index);
            if (SING_S.test(nl) || /^[A-Z]/.test(C.t.charAt(m.index + m[0].indexOf(noun)))) continue;   /* news is / James is */
            if (pats[i][1] === 'bplur' && /\bof\s+(?:my|the|our|his|her|their|these|those|your)?\s*$/i.test(C.tm.slice(Math.max(0, m.index - 14), m.index))) continue;   /* one of my friends is */
            if (pats[i][1] === 'bplur' && /^(this|us|yes|his|its|hers|ours|yours|theirs|thanks|means|is|was|has|does|goes|always|sometimes|perhaps|thus|towards|besides|afterwards|whereas|unless|less)$/.test(nl)) continue;
            fix = { is: 'are', was: 'were', has: 'have' }[vwl] || from3s(vwl);
            hits.push({ s: off, e: off + m[m.length - 1].length, t: m[m.length - 1], fix: fix, sev: pats[i][1] === 'qplur' ? 3 : 2 }); continue;
          }
          else if (pats[i][1] === 'I') { fix = { is: 'am', are: 'am', has: 'have', were: 'was', "doesn't": "don't", 'does not': 'do not' }[vwl]; }
          else if (pats[i][1] === 'plur') { fix = { is: 'are', has: 'have', was: 'were', "doesn't": "don't", 'does not': 'do not' }[vwl]; }
          else { fix = { is: 'are', was: 'were', has: 'have' }[vwl] || from3s(vwl); }
          hits.push({ s: off, e: off + m[m.length - 1].length, t: m[m.length - 1], fix: fix });
        }
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    var COMP = 'better|worse|bigger|smaller|larger|higher|lower|cheaper|easier|harder|faster|slower|longer|shorter|older|younger|stronger|weaker|richer|poorer|happier|healthier|safer|nicer|wider|deeper|hotter|colder|warmer|cooler|earlier|later|busier|quieter|simpler|cleaner|dirtier|heavier|lighter|greater|fewer|closer|farther|further|brighter|darker|tougher|thicker|thinner|taller|wiser|kinder|funnier|prettier|uglier|angrier|luckier|sadder|fatter|wetter|drier|newer|freer|cuter|calmer|lazier|noisier|friendlier|smarter|louder|softer|harsher';
    var SUP = COMP.replace(/er\b/g, 'est').replace(/better/, 'best').replace(/worse/, 'worst').replace(/farthest/, 'farthest');
    FN.g_double_comp = function (r, C) {
      var hits = [], m, re = RE('\\b(more)\\s+(' + COMP + ')\\b|\\b(most)\\s+(' + SUP + ')\\b', 'gi');
      while ((m = re.exec(C.tm)) !== null) {
        var w = m[0], word = m[2] || m[4];
        hits.push({ s: m.index, e: m.index + w.length, t: w, fix: keepCase(w, word) });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    var SUB = 'because|though|although|if|when|while|since|unless|even though|even if|whereas|as long as|as soon as|before|after|until';
    FN.g_fragment = function (r, C) {
      var hits = [];
      for (var i = 0; i < C.S.length; i++) {
        var s = C.S[i], t = s.t;
        if (!RE('^(' + SUB + ')\\b', 'i').test(t)) continue;
        if (t.indexOf(',') >= 0) continue;
        var toks = tokens(t); if (toks.length < 3 || toks.length > 14) continue;
        if (/\b(I|we|you|they|he|she|it|people|students)\s+(should|can|will|must|need|have to|are|is|am)\b/i.test(t.replace(RE('^(' + SUB + ')\\s+\\w+\\s+\\w+', 'i'), ''))) continue;
        hits.push({ s: s.s, e: s.e, t: t, wide: 1 });
      }
      C.add(r, hits, { det: hits.length + '文' });
    };
    var INTRO = 'however|for example|for instance|in my opinion|first|firstly|second|secondly|third|finally|therefore|in addition|also|moreover|furthermore|on the other hand|in conclusion|for these reasons|of course|in fact|as a result|today|nowadays|recently|first of all|in this way|that is why|this is why|besides|then|so|thus|hence|overall|all in all|to sum up|in short|in other words|indeed|actually|generally|usually|sometimes|unfortunately|fortunately|clearly|obviously|luckily|personally|honestly|yes|no|well|next|lastly|in particular|for one thing|for another|above all|after all|in the end|at last|at first|in the past|in the future|these days|in japan|in my case|in my view|to me|as for me|for me|in my experience|in general|in short|last|later|at the same time|at that time|at this point|in this case|in that case|in some cases|in many cases|for this reason|because of this|thanks to this';
    FN.g_comma_splice = function (r, C) {
      var hits = [];
      for (var i = 0; i < C.S.length; i++) {
        var s = C.S[i], t = s.t, m, re = /,\s+(?:then\s+|also\s+|now\s+)?(I|you|he|she|it|we|they|this|that|there|people|students)\s+(am|is|are|was|were|have|has|had|can|will|would|should|could|do|does|did|don't|doesn't|didn't|think|believe|feel|want|need|like|know|go|went|get|got|make|made|take|took|use|used|see|saw|say|said|become|became|ate|came|gave|[a-z]+ed|[a-z]+s)\b/gi;
        while ((m = re.exec(t)) !== null) {
          var pre = t.slice(0, m.index).trim();
          if (RE('^(' + SUB + ')\\b', 'i').test(pre)) continue;
          pre = pre.replace(RE('^(?:(?:' + INTRO + '),\\s*)+', 'i'), '');
          if (RE('^(' + SUB + ')\\b', 'i').test(pre)) continue;   /* First, when …, they … */
          var seg = pre.split(/,|\b(?:and|but|so|or|yet)\b/i).pop().replace(/^\s+/, '');
          if (/^(by|in|on|at|with|without|through|during|after|before|once|as|just as|thanks to|because of|for|from|since|while|when|whenever|if|although|though|unlike|like|despite|in spite of|among|within|across|over|under|until|upon|according to|compared with|compared to|instead of|besides|to|into|thanks|due to|now that|even if|even though)\b/i.test(seg)) continue;   /* By helping …, they / Once …, we / In rural areas, there */
          if (RE('^(' + INTRO + ')$', 'i').test(pre)) continue;
          if (tokens(pre).length < 3) continue;
          if (/\b(and|but|or|so|because|although|though|while|when|if|since|as|which|who|that|where|whereas|unless|until|after|before)\s*$/i.test(pre)) continue;
          if (!/\b(am|is|are|was|were|have|has|had|can|will|would|should|could|must|may|might|do|does|did|[a-z]+ed|[a-z]+s)\b/i.test(pre) && !RE('\\b(I|you|we|they)\\s+(?:' + ADV + '\\s+)?(' + VERBS.join('|') + ')\\b', 'i').test(pre)) continue;
          if (/\b(not only|such as|for example|including|like|as)\s*$/i.test(pre)) continue;
          var off = s.s + m.index;
          hits.push({ s: off, e: off + 1, t: ',', fix: '.', sev: 2, _cap: off + m[0].lastIndexOf(m[1] + ' ' + m[2]) });
        }
      }
      /* 修正では「, ○」→「. ○」に加えて次語を大文字にする */
      for (var k = 0; k < hits.length; k++) {
        var h = hits[k], rest = C.t.slice(h.e, h._cap + 1);
        h.e = h._cap + 1; h.t = C.t.slice(h.s, h.e); h.fix = '.' + rest.slice(1, -1) + rest.slice(-1).toUpperCase();
      }
      C.add(r, hits, { det: hits.length + '文' });
    };
    FN.g_modal_base = function (r, C) {
      var hits = [], m, re = /\b(can|could|will|would|should|must|may|might|shall|don't|doesn't|didn't|do not|does not|did not|can't|cannot|won't|couldn't|wouldn't|shouldn't|mustn't)\s+(to\s+[a-z]+|[a-z]+)\b/gi;
      while ((m = re.exec(C.tm)) !== null) {
        var md = m[1].toLowerCase(), v = m[2].toLowerCase(), off = m.index + m[0].lastIndexOf(m[2]), fix = null;
        if (/^to\s/.test(v)) { var base = v.replace(/^to\s+/, ''); if (VSET[base] || /^(be|do|go|have|get|make|take|study|work|play|use)$/.test(base)) fix = base; else continue; }
        else if (VS_SET[v]) fix = VS_SET[v];
        else if (IRREG_PAST[v] && v !== 'read' && v !== 'left') fix = IRREG_PAST[v];
        else if (/ed$/.test(v) && VSET[fromPast(v)] && !/^(need|tired|bored|interested|excited|worried|used|supposed|called|named|allowed|related|based|involved|concerned)$/.test(v)) fix = fromPast(v);
        else continue;
        if (md === 'will' && v === 'to') continue;
        hits.push({ s: off, e: off + m[2].length, t: m[2], fix: fix });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_verb_pattern = function (r, C) {
      var hits = [], m, re1 = /\b(enjoy|enjoys|enjoyed|enjoying|finish|finishes|finished|mind|minds|avoid|avoids|avoided|practice|practices|practiced|consider|considers|considered|suggest|suggests|suggested|give up|gave up|given up|recommend|recommends|recommended)\s+to\s+([a-z]+)\b/gi;
      var re2 = /\b(want|wants|wanted|hope|hopes|hoped|decide|decides|decided|plan|plans|planned|would like|need|needs|needed|expect|expects|expected|promise|promised|refuse|refused|agree|agreed|manage|managed|afford|learn|learned)\s+([a-z]+ing)\b/gi;
      while ((m = re1.exec(C.tm)) !== null) {
        var base = m[2].toLowerCase(); if (!VSET[base] && !/^(be|do|go|have|get|make|take|study|work|play|use|swim|run|read|write|watch|listen|talk|speak|cook|sing|dance|draw|travel|shop|eat|drink|help|learn|teach|meet|see|visit|walk|sleep|clean|exercise|relax|chat|surf|climb|ski|skate|fish|hike|camp|jog)$/.test(base)) continue;
        var off = m.index + m[0].indexOf('to'); hits.push({ s: off, e: m.index + m[0].length, t: m[0].slice(m[0].indexOf('to')), fix: toIng(base) });
      }
      while ((m = re2.exec(C.tm)) !== null) {
        var g = m[2].toLowerCase(), b2 = g.replace(/ing$/, '');
        if (/^(nothing|anything|everything|something|morning|evening|king|ring|spring|wedding|building|meeting|training|shopping|clothing|thing|during|bring|swing|string|feeling|feelings|ceiling|willing|interesting|boring|exciting|surprising|amazing|missing|following|remaining|existing|increasing|growing|working|living|parking|cooking|reading|writing|learning|teaching|swimming|running|studying|fishing|hiking|camping|shopping)$/.test(g)) continue;
        var base2 = VSET[b2] ? b2 : (VSET[b2 + 'e'] ? b2 + 'e' : (VSET[b2.slice(0, -1)] && /([bdgklmnprstv])\1$/.test(b2) ? b2.slice(0, -1) : null));
        if (!base2) continue;
        var off2 = m.index + m[0].lastIndexOf(m[2]); hits.push({ s: off2, e: off2 + m[2].length, t: m[2], fix: 'to ' + base2 });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_repeat_word = function (r, C) {
      var hits = [], m, re = /\b([A-Za-z]+)\s+\1\b/gi;
      while ((m = re.exec(C.tm)) !== null) {
        var w = m[1].toLowerCase();
        if (/^(that|had|very|so|no|bye|ha|really|is|was)$/.test(w) && w !== 'is' && w !== 'was') continue;
        if (w === 'is' || w === 'was') { /* "what it is is" は稀。誤りとして扱う */ }
        hits.push({ s: m.index, e: m.index + m[0].length, t: m[0], fix: m[1] });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    FN.g_its_their = function (r, C) {
      var hits = [], m, i, pats = [
        [/\bit's (own|advantages?|disadvantages?|benefits?|effects?|impacts?|value|meaning|importance|role|purpose|history|culture|people|citizens|economy|environment|future|name|size|quality|price|cost|population|members|students|users|problems?)\b/gi, function (mm) { return keepCase(mm[0], 'its ' + mm[1]); }],
        [/\btheir (is|are|was|were)\b/gi, function (mm) { return keepCase(mm[0], 'there ' + mm[1]); }],
        [/\bthere (own|parents|children|friends|families|lives|jobs|health|future|opinions?|ideas|money|time|studies|homework|teachers|school|dreams?|goals?|skills?|abilities|knowledge|countries|homes?|houses?|cars?|phones?|smartphones?|ways?|life|culture|language|country|city|town|teams?|work|job|rooms?|family|teacher|class|hobby|hobbies|efforts?|behavior|attitude|experiences?|best|minds?|bodies|body|hands?|eyes|hearts?|voices?|names?|lifestyles?|habits?|choices?|decisions?|responsibilit(?:y|ies)|problems?|needs|english|japanese|chinese|korean|french|spanish|grades?|scores?|classes|lessons|studies|teachers|dreams|ways|lives|own|new|first|best|daily|favorite)\b/gi, function (mm) { return keepCase(mm[0], 'their ' + mm[1]); }],
        [/\bits (a|an|the|very|not|true|because|time to|my|our|your|his|her|their|going|been|difficult|easy|important|good|bad|better|hard|clear|fun|interesting|possible|impossible|necessary|natural|dangerous|convenient|cheap|expensive|hot|cold|late|early)\b/gi, function (mm) { return keepCase(mm[0], "it's " + mm[1]); }],
        [/\bit's ([a-z]+) (is|was|are|were|has|have|will|can|should|must)\b/gi, function (mm) { return keepCase(mm[0], 'its ' + mm[1] + ' ' + mm[2]); }],
        [RE('\\b(more|less|better|worse|rather|other|' + COMP + ')\\s+then\\b', 'gi'), function (mm) { return mm[0].replace(/then$/i, 'than'); }],
        [/\btoo (go|be|do|make|see|get|study|learn|play|help|work|use|become|have|take|buy|eat|read|write|watch|visit|know|understand|improve|solve)\b/gi, function (mm) { return keepCase(mm[0], 'to ' + mm[1]); }]
      ];
      for (i = 0; i < pats.length; i++) { var re = pats[i][0]; re.lastIndex = 0; while ((m = re.exec(C.tm)) !== null) hits.push({ s: m.index, e: m.index + m[0].length, t: m[0], fix: pats[i][1](m) }); }
      C.add(r, hits, { det: hits.length + 'か所' });
    };

    /* --- C: 語彙 --- */
    FN.v_alot = function (r, C) {
      var hits = [], m, re = /\b(a lot of|lots of)\s+([A-Za-z]+)\b/gi;
      while ((m = re.exec(C.tm)) !== null) {
        var nx = m[2].toLowerCase(), pl = /s$/.test(nx) && !/^(news|bus|class|glass|progress|success|happiness|stress|business|kindness|fitness)$/.test(nx);
        hits.push({ s: m.index, e: m.index + m[1].length, t: m[1], fix: keepCase(m[1], pl ? 'many' : 'much') });
      }
      if (hits.length >= (r.min || 3)) C.add(r, hits, { det: hits.length + '回' });
    };
    FN.v_contraction = function (r, C) {
      var hits = [], m, re = /\b([A-Za-z]+n't|I'm|I've|I'd|I'll|you're|you've|you'll|we're|we've|we'll|they're|they've|they'll|he's|she's|it's|that's|there's|let's|what's|who's|he'll|she'll|it'll)\b/gi;
      var map = { "can't": 'cannot', "won't": 'will not', "i'm": 'I am', "i've": 'I have', "i'd": 'I would', "i'll": 'I will', "you're": 'you are', "you've": 'you have', "you'll": 'you will', "we're": 'we are', "we've": 'we have', "we'll": 'we will', "they're": 'they are', "they've": 'they have', "they'll": 'they will', "he's": 'he is', "she's": 'she is', "it's": 'it is', "that's": 'that is', "there's": 'there is', "let's": 'let us', "what's": 'what is', "who's": 'who is', "he'll": 'he will', "she'll": 'she will', "it'll": 'it will', "shan't": 'shall not' };
      while ((m = re.exec(C.tm)) !== null) {
        var l = m[0].toLowerCase(), fix = map[l] || (/n't$/.test(l) ? l.replace(/n't$/, ' not') : null);
        if (!fix) continue;
        hits.push({ s: m.index, e: m.index + m[0].length, t: m[0], fix: keepCase(m[0], fix) });
      }
      C.add(r, hits, { det: hits.length + 'か所' });
    };
    var STOP = 'the a an and or but so if because of to in on at for with from by as is are was were be been being am do does did have has had not no yes it its this that these those i you he she we they me him her us them my your his our their mine yours theirs there here what which who whom whose when where why how than then too very can could will would should may might must shall also just only even more most much many some any all each every other another such own same into about over under after before between through during without within up down out off again further once few both'.split(' ');
    var STOPSET = {}; for (var si = 0; si < STOP.length; si++) STOPSET[STOP[si]] = 1;
    function lemma(w) { var l = w.toLowerCase().replace(/'s$/, ''); if (/ies$/.test(l) && l.length > 4) return l.slice(0, -3) + 'y'; if (/(s|x|z|ch|sh)es$/.test(l) && l.length > 4) return l.slice(0, -2); if (/s$/.test(l) && !/ss$/.test(l) && l.length > 3) return l.slice(0, -1); return l; }
    FN.v_repeat = function (r, C) {
      var cnt = {}, pos = {}, i, topic = {}, tw = tokens((C.opt.topic || '') + ' ' + (C.opt.points || []).join(' '));
      for (i = 0; i < tw.length; i++) topic[lemma(tw[i].w)] = 1;
      for (i = 0; i < C.mtoks.length; i++) {
        var k = lemma(C.mtoks[i].w);
        if (STOPSET[k] || k.length < 3 || /^[0-9]/.test(k) || topic[k]) continue;
        cnt[k] = (cnt[k] || 0) + 1; (pos[k] = pos[k] || []).push(C.mtoks[i]);
      }
      var thr = Math.max(r.thr || 6, Math.round(C.n / (r.per || 18))), hits = [], words = [];
      for (var k2 in cnt) if (cnt[k2] >= thr) { words.push(k2); for (var j = 0; j < pos[k2].length; j++) hits.push({ s: pos[k2][j].s, e: pos[k2][j].e, t: pos[k2][j].w }); }
      if (!words.length) return;
      var syn = D.synonyms || {}, det = [];
      for (i = 0; i < words.length && i < 4; i++) { var sy = syn[words[i]]; det.push(words[i] + '（' + cnt[words[i]] + '回' + (sy ? '。言い換え: ' + sy.slice(0, 3).join(', ') : '') + '）'); }
      C.add(r, hits, { det: det.join('　'), metric: { words: words, thr: thr } });
    };
    FN.v_ttr = function (r, C) {
      if (C.n < (r.minWords || 80)) return;
      var seen = {}, u = 0;
      for (var i = 0; i < C.toks.length; i++) { var k = C.toks[i].l.replace(/'s$/, ''); if (!seen[k]) { seen[k] = 1; u++; } }
      var ttr = u / C.n;
      if (ttr < (r.thr || 0.45)) C.add(r, [{ s: 0, e: 0, t: '' }], { det: '異なり語数 ' + u + ' ÷ 総語数 ' + C.n + ' ＝ ' + ttr.toFixed(2) + '（目安 0.45 以上）', metric: { ttr: ttr, unique: u } });
    };
    FN.v_vague = function (r, C) {
      var hits = [], m, re = /\b(things?|good|bad|very|nice)\b/gi, map = D.vague || {};
      while ((m = re.exec(C.tm)) !== null) hits.push({ s: m.index, e: m.index + m[0].length, t: m[0] });
      if (hits.length < (r.min || 4) || hits.length / Math.max(1, C.n) < (r.ratio || 0.03)) return;
      var seen = {}, det = [];
      for (var i = 0; i < hits.length; i++) { var l = hits[i].t.toLowerCase().replace(/s$/, ''); if (seen[l]) continue; seen[l] = 1; if (map[l]) det.push(l + ' → ' + map[l].slice(0, 3).join(' / ')); }
      C.add(r, hits, { det: hits.length + '回。' + det.join('　') });
    };
    FN.v_start_i = function (r, C) {
      if (C.S.length < 4) return;
      var c = 0, hits = [];
      for (var i = 0; i < C.S.length; i++) if (/^["']?I\b/.test(C.S[i].t)) { c++; hits.push({ s: C.S[i].s, e: C.S[i].s + 1, t: 'I' }); }
      if (c / C.S.length >= (r.ratio || 0.6)) C.add(r, hits, { det: C.S.length + '文中' + c + '文が I で始まっています。主語を変えると単調さが消えます。' });
    };

    /* ============================================================
     *  チェック本体
     * ========================================================== */
    function check(text, opt) {
      opt = opt || {};
      var t = normalize(text), C = new Ctx(t, opt), i;
      if (NLP) { try { C.nlpDoc = NLP(C.tm); } catch (e) { C.nlpDoc = null; } }
      for (i = 0; i < RULES.length; i++) {
        var r = RULES[i];
        if (!ruleOn(r, C.fmt)) continue;
        if (!rv(r.sev, C.fmt)) continue;
        var d = r.detect || {};
        try {
          if (d.type === 'regex') runRegex(r, C);
          else if (d.type === 'dict') runDict(r, C);
          else if (FN[d.fn || r.id]) FN[d.fn || r.id](r, C);
        } catch (e) { /* 1つのルールの失敗で全体を止めない */ }
      }
      var axes = score(C), metrics = stats(C);
      return { ver: VER, text: t, format: C.fmt, words: C.n, sentences: C.S.length, paragraphs: C.P.length,
        findings: C.findings, hits: C.hits, axes: axes, metrics: metrics, band: band(C), nlp: !!C.nlpDoc };
    }
    function band(C) {
      var W = C.opt.words || C.F.words; if (!W) return null;
      var n = C.n, edge = (SCORING['default'] && SCORING['default'].edge) || 5, st = 'in';
      if (n < W[0] - edge || n > W[1] + edge) st = 'out'; else if (n < W[0] || n > W[1]) st = 'edge';
      return { n: n, lo: W[0], hi: W[1], state: st };
    }
    function score(C) {
      var sc = SCORING[C.fmt] || SCORING['default'] || {}, sevw = sc.sev || { 3: 1.0, 2: 0.5, 1: 0.15 }, decay = sc.decay || [1, 0.8, 0.6, 0.45, 0.35];
      var ded = { kos: [], goi: [], bun: [] }, i;
      for (i = 0; i < C.findings.length; i++) {
        var f = C.findings[i]; if (!ded[f.ax] || f.id === 'a_words_out' || f.id === 'a_words_edge') continue;
        var w = sevw[f.sev] || 0; if (f.n > 1) w += Math.min(w, (sevw[f.sev] || 0) * 0.25 * Math.min(4, f.n - 1));
        ded[f.ax].push(w);
      }
      var out = {};
      for (var k in ded) {
        var d = ded[k].slice().sort(function (a, b) { return b - a; }), sum = 0;
        for (i = 0; i < d.length; i++) sum += d[i] * (i < decay.length ? decay[i] : 0.25);
        out[k] = Math.max(0, Math.min(4, Math.round(4 - sum)));
      }
      return out;
    }
    function stats(C) {
      var lens = [], mx = 0, sum = 0, i;
      for (i = 0; i < C.S.length; i++) { var n = sentTokens(C.S[i], C.toks).length; lens.push(n); sum += n; if (n > mx) mx = n; }
      var seen = {}, u = 0;
      for (i = 0; i < C.toks.length; i++) { var k = C.toks[i].l.replace(/'s$/, ''); if (!seen[k]) { seen[k] = 1; u++; } }
      var out = { words: C.n, sentences: C.S.length, paragraphs: C.P.length, avgLen: C.S.length ? Math.round(sum / C.S.length * 10) / 10 : 0, maxLen: mx, unique: u, ttr: C.n ? Math.round(u / C.n * 100) / 100 : 0 };
      for (var k2 in C.extra) out[k2] = C.extra[k2];
      return out;
    }
    /* 修正を適用する（後ろから置換して位置ずれを防ぐ） */
    function applyFix(text, hits) {
      var t = normalize(text), hs = [];
      for (var i = 0; i < hits.length; i++) if (hits[i].fix != null && hits[i].e >= hits[i].s) hs.push(hits[i]);
      hs.sort(function (a, b) { return b.s - a.s; });
      var last = Infinity;
      for (var j = 0; j < hs.length; j++) { var h = hs[j]; if (h.e > last) continue; t = t.slice(0, h.s) + h.fix + t.slice(h.e); last = h.s; }
      return t;
    }

    return { ver: VER, check: check, applyFix: applyFix, wordCount: wordCount, countWords: countWords, tokens: tokens, sentences: sentences, rules: RULES, formats: FORMATS, ruleOn: ruleOn, rv: rv, normalize: normalize };
  }

  return { ver: VER, create: create, wordCount: wordCount, countWords: countWords, emailParts: emailParts, overlapRuns: overlapRuns, jpNumbers: jpNumbers, enNumbers: enNumbers, tokens: tokens, sentences: sentences, normalize: normalize, maskQuotes: maskQuotes, to3s: to3s, toIng: toIng, fromPast: fromPast };
});
/* ============================================================
 *  テストランナー（Node.js とブラウザで共通）
 *  - selfTest(engine, rules)        … ルール定義の yes / no 例文を全件回す
 *  - runCases(engine, cases)        … 答案セット（誤りの種類と位置つき）を回し、ルールごとの適合率・再現率を出す
 *  どちらも同じ形の report を返す。
 * ========================================================== */
(function (root, factory) {
  if (typeof module === 'object' && module.exports) { module.exports = factory(); }
  else { root.EWC_RUNNER = factory(); }
})(typeof self !== 'undefined' ? self : this, function () {
  'use strict';

  function firstFormat(engine, r) {
    var fmts = ['2O', 'P2O', '3O', 'P1O', 'P2PO', 'FR', 'UF', '3E', 'P2E', '2S', 'P2PS', 'P1S', 'UT'];
    for (var i = 0; i < fmts.length; i++) if (engine.ruleOn(r, fmts[i]) && engine.rv(r.sev, fmts[i])) return fmts[i];
    return 'FR';
  }
  function found(res, id) {
    for (var i = 0; i < res.findings.length; i++) if (res.findings[i].id === id && res.findings[i].sev > 0) return res.findings[i];
    return null;
  }

  /* ルール定義の例文テスト */
  function selfTest(engine, rules) {
    var rows = [], pass = 0, fail = 0, list = (rules && rules.rules) || [];
    for (var i = 0; i < list.length; i++) {
      var r = list[i], base = r.topt || {}, fmt = base.format || firstFormat(engine, r);
      var sets = [['yes', r.yes || []], ['no', r.no || []]];
      for (var s = 0; s < sets.length; s++) {
        for (var e = 0; e < sets[s][1].length; e++) {
          var ex = sets[s][1][e], t = typeof ex === 'string' ? ex : ex.t;
          var opt = { format: fmt, topic: base.topic || '', points: base.points || [], words: base.words || null, source: base.source || '', name: base.name || '' };
          for (var q0 in base) if (q0 !== 'format') opt[q0] = base[q0];
          if (typeof ex === 'object') for (var q in ex) if (q !== 't') opt[q] = ex[q];
          var res = engine.check(t, opt), f = found(res, r.id), fired = !!f;
          var ok = sets[s][0] === 'yes' ? fired : !fired;
          if (ok) pass++; else fail++;
          rows.push({ rule: r.id, expect: sets[s][0] === 'yes' ? '検出する' : '検出しない', result: ok ? 'OK' : 'NG', text: t.length > 60 ? t.slice(0, 60) + '…' : t,
            got: f ? (f.hits || []).map(function (h) { return h.t; }).slice(0, 3).join(' | ') : '' });
        }
      }
    }
    return { kind: 'selfTest', pass: pass, fail: fail, rows: rows, rules: list.length };
  }

  /* 答案セットのテスト
   *  case: { id, format, text, topic?, points?, words?, errors: [{id, text?}] , model?:1 }
   *  予測した指摘 (rule, hit) が、期待 errors の同じ rule で text を含む（または text 指定なし）ものと一致すれば TP。
   */
  function runCases(engine, cases) {
    var per = {}, rows = [], modelFail = [], i, j, k;
    function P(id) { return per[id] = per[id] || { tp: 0, fp: 0, fn: 0, sev: 0, fpList: [], fnList: [] }; }
    for (i = 0; i < cases.length; i++) {
      var c = cases[i], res = engine.check(c.text, { format: c.format, topic: c.topic || '', points: c.points || [], words: c.words || null, source: c.source || '', name: c.name || '' });
      var exp = (c.errors || []).slice(), used = [];
      for (j = 0; j < exp.length; j++) used.push(false);
      var crit = 0;
      for (j = 0; j < res.findings.length; j++) {
        var f = res.findings[j]; if (!f.sev) continue;
        if (f.sev === 3) crit++;
        var p = P(f.id); p.sev = Math.max(p.sev, f.sev);
        var hits = f.hits && f.hits.length ? f.hits : [{ t: '' }];
        /* text の無い期待は「このルールが出ること」だけを見る（何か所出ても1件として扱う） */
        var ruleLevel = -1;
        for (var m0 = 0; m0 < exp.length; m0++) if (!used[m0] && exp[m0].id === f.id && !exp[m0].text) { ruleLevel = m0; break; }
        if (ruleLevel >= 0) { used[ruleLevel] = true; p.tp++; continue; }
        for (k = 0; k < hits.length; k++) {
          var h = hits[k], matched = -1;
          for (var m = 0; m < exp.length; m++) {
            if (used[m] || exp[m].id !== f.id) continue;
            if (!h.t || h.t.toLowerCase().indexOf(exp[m].text.toLowerCase()) >= 0 || exp[m].text.toLowerCase().indexOf(h.t.toLowerCase()) >= 0) { matched = m; break; }
          }
          if (matched >= 0) { used[matched] = true; p.tp++; }
          else { p.fp++; p.fpList.push({ 'case': c.id, text: h.t || '(全体)' }); }
        }
      }
      for (j = 0; j < exp.length; j++) if (!used[j]) { var q = P(exp[j].id); q.fn++; q.fnList.push({ 'case': c.id, text: exp[j].text || '' }); }
      if (c.model && crit > 0) modelFail.push({ 'case': c.id, crit: res.findings.filter(function (f) { return f.sev === 3; }).map(function (f) { return f.id; }) });
      rows.push({ 'case': c.id, format: c.format, words: res.words, findings: res.findings.length, axes: res.axes });
    }
    var table = [], allTp3 = 0, allFp3 = 0;
    for (var id in per) {
      var x = per[id], prec = (x.tp + x.fp) ? x.tp / (x.tp + x.fp) : null, rec = (x.tp + x.fn) ? x.tp / (x.tp + x.fn) : null;
      if (x.sev === 3) { allTp3 += x.tp; allFp3 += x.fp; }
      table.push({ rule: id, sev: x.sev, tp: x.tp, fp: x.fp, fn: x.fn, precision: prec == null ? '-' : Math.round(prec * 100) + '%', recall: rec == null ? '-' : Math.round(rec * 100) + '%',
        ok: (x.sev === 3 && prec != null && prec < 0.9) ? 'NG 重大の適合率90%未満' : (x.fp ? '誤検知あり' : 'OK'), fpList: x.fpList, fnList: x.fnList });
    }
    table.sort(function (a, b) { return (a.rule < b.rule ? -1 : 1); });
    return { kind: 'cases', cases: cases.length, table: table, rows: rows, modelFail: modelFail, critPrecision: (allTp3 + allFp3) ? Math.round(allTp3 / (allTp3 + allFp3) * 1000) / 10 : null };
  }

  function summarize(rep) {
    var lines = [];
    if (rep.kind === 'selfTest') {
      lines.push('例文テスト: 合格 ' + rep.pass + ' / 不合格 ' + rep.fail + '（' + rep.rules + ' ルール）');
      for (var i = 0; i < rep.rows.length; i++) if (rep.rows[i].result === 'NG') lines.push('  NG ' + rep.rows[i].rule + ' [' + rep.rows[i].expect + '] ' + rep.rows[i].text + (rep.rows[i].got ? '  got: ' + rep.rows[i].got : ''));
    } else {
      lines.push('答案テスト: ' + rep.cases + ' 本。重大の適合率（全体） ' + (rep.critPrecision == null ? '-' : rep.critPrecision + '%'));
      lines.push('rule\tsev\tTP\tFP\tFN\tprec\trecall\t判定');
      for (var j = 0; j < rep.table.length; j++) { var t = rep.table[j]; lines.push([t.rule, t.sev, t.tp, t.fp, t.fn, t.precision, t.recall, t.ok].join('\t')); }
      for (var k = 0; k < rep.table.length; k++) {
        var x = rep.table[k];
        for (var a = 0; a < x.fpList.length; a++) lines.push('  誤検知 ' + x.rule + ' @' + x.fpList[a]['case'] + ': ' + x.fpList[a].text);
        for (var b = 0; b < x.fnList.length; b++) lines.push('  見逃し ' + x.rule + ' @' + x.fnList[b]['case'] + ': ' + x.fnList[b].text);
      }
      if (rep.modelFail.length) { for (var m = 0; m < rep.modelFail.length; m++) lines.push('  模範答案に重大: ' + rep.modelFail[m]['case'] + ' ' + rep.modelFail[m].crit.join(',')); }
      else lines.push('模範答案: 重大の指摘 0 件');
    }
    return lines.join('\n');
  }

  return { selfTest: selfTest, runCases: runCases, summarize: summarize };
});
/* ============================================================
 *  英作文セルフチェッカー 画面側  ui/app.js
 *  判定はすべて EWC_ENGINE（engine/checker.js）に任せる。ここは入出力だけ。
 * ========================================================== */
(function(){
var R=document.getElementById('ewc_root');
if(!R||R.getAttribute('data-on')==='1')return;
R.setAttribute('data-on','1');
var CF={};try{CF=JSON.parse(R.getAttribute('data-cfg')||'{}');}catch(e){}
var D=function(i){return document.getElementById(i);};
var LS={g:function(k,d){try{var v=localStorage.getItem(k);return v?JSON.parse(v):d;}catch(e){return d;}},
        s:function(k,v){try{localStorage.setItem(k,JSON.stringify(v));}catch(e){}},
        r:function(k){try{localStorage.removeItem(k);}catch(e){}}};
function esc(s){return String(s==null?'':s).replace(/[&<>"']/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c];});}
function put(id,h){var e=D(id);if(e)e.innerHTML=h;}
function show(id,on){var e=D(id);if(e)e.classList[on?'remove':'add']('ewc-hide');}

/* エディタの余計な p / br を掃除 */
(function tidy(){
 var pp=R.parentNode;
 if(pp&&pp.tagName&&pp.tagName.toLowerCase()==='p'){pp.parentNode.insertBefore(R,pp);pp.parentNode.removeChild(pp);}
 var br=R.querySelectorAll('br');
 for(var i=br.length-1;i>=0;i--){if(!br[i].closest||!br[i].closest('textarea,.ewc-note'))br[i].parentNode.removeChild(br[i]);}
 var ps=R.querySelectorAll('p');
 for(var j=ps.length-1;j>=0;j--){var e=ps[j];if((e.id&&e.id.indexOf('ewc-')===0)||(e.className&&String(e.className).indexOf('ewc-')===0))continue;if(!e.children.length&&!e.textContent.replace(/\s/g,''))e.parentNode.removeChild(e);}
})();

/* ---------- 要素 ---------- */
var TA=D('ewc-ta'),RUN=D('ewc-run'),RES=D('ewc-res'),WC=D('ewc-wc'),BAR=D('ewc-bar');
var EX=D('ewc-exam'),EG=D('ewc-grade'),ET=D('ewc-type'),ETOP=D('ewc-topic'),EPT=D('ewc-points'),EMIN=D('ewc-wmin'),EMAX=D('ewc-wmax'),ESRC=D('ewc-src'),ENAME=D('ewc-name');
var HL=D('ewc-hl'),LIST=D('ewc-list');
var SEVN={3:'重大',2:'注意',1:'参考'},AXN={kos:'構成',goi:'語彙',bun:'文法'};

/* ---------- データ（ルール・辞書は初回チェック時に fetch） ---------- */
var DATA={rules:null,dict:null,loading:null,nlp:null,nlpState:'idle'},ENG=null;
function dataUrl(name){return String(CF.data||'').replace(/\/?$/,'/')+name;}
function loadData(){
 if(DATA.loading)return DATA.loading;
 var v=CF.vfile||'1-0';
 DATA.loading=Promise.all([
  fetch(dataUrl('ewc-rules-v'+v+'.json')).then(function(r){if(!r.ok)throw new Error('rules');return r.json();}),
  fetch(dataUrl('ewc-dict-v'+v+'.json')).then(function(r){if(!r.ok)throw new Error('dict');return r.json();})
 ]).then(function(a){DATA.rules=a[0];DATA.dict=a[1];ENG=EWC_ENGINE.create({rules:a[0],dict:a[1],nlp:DATA.nlp});afterData();return ENG;});
 return DATA.loading;
}
function loadNlp(){
 if(DATA.nlpState!=='idle'||!CF.nlp)return;
 DATA.nlpState='loading';
 var s=document.createElement('script');s.src=dataUrl(CF.nlp);s.async=true;
 s.onload=function(){DATA.nlp=window.nlp||null;DATA.nlpState=DATA.nlp?'ready':'error';if(DATA.nlp&&DATA.rules){ENG=EWC_ENGINE.create({rules:DATA.rules,dict:DATA.dict,nlp:DATA.nlp});if(LAST&&LAST.text===ENG.normalize(TA.value))run(true);}};
 s.onerror=function(){DATA.nlpState='error';};
 document.head.appendChild(s);
}
/* ルール定義が届いたら、級・形式の選択肢と件数表示を作る */
var FORMATS={},GRADES={};
function afterData(){
 FORMATS=DATA.rules.formats||{};GRADES=DATA.rules.grades||{};
 var n=0;for(var i=0;i<DATA.rules.rules.length;i++)n++;
 var cn=D('ewc-count');if(cn)cn.textContent='全'+n+'項目をチェックします。';
 fillSelects();
}
/* データが来る前でも選択肢を出せるように、最低限の定義を持つ */
var FALLBACK={grades:{"3":{label:'3級',formats:['3E','3O']},"p2":{label:'準2級',formats:['P2E','P2O']},"p2p":{label:'準2級プラス',formats:['P2PS','P2PO']},"2":{label:'2級',formats:['2S','2O']},"p1":{label:'準1級',formats:['P1S','P1O']},"univ":{label:'大学入試',formats:['UF','UT']}},
 formats:{"3O":{type:'opinion',words:[25,35],minutes:10},"P2O":{type:'opinion',words:[50,60],minutes:15},"P2PO":{type:'opinion',words:[50,60],minutes:15},"2O":{type:'opinion',words:[80,100],minutes:20},"P1O":{type:'opinion',words:[120,150],minutes:25},
  "3E":{type:'email',words:[15,25],minutes:10},"P2E":{type:'email',words:[40,50],minutes:15},"P2PS":{type:'summary',words:[25,35],minutes:15},"2S":{type:'summary',words:[45,55],minutes:20},"P1S":{type:'summary',words:[60,70],minutes:20},
  "UF":{type:'free_essay',words:[80,120],minutes:20,custom:1},"UT":{type:'trans',words:null,minutes:0},"FR":{type:'free',words:null}}};
var TYPE_LABEL={opinion:'意見論述',email:'Eメール',summary:'要約',free:'英文チェックのみ',free_essay:'自由英作文',trans:'和文英訳'};
function G(){return Object.keys(GRADES).length?GRADES:FALLBACK.grades;}
function F(){return Object.keys(FORMATS).length?FORMATS:FALLBACK.formats;}
function fillSelects(){
 var g=G(),f=F(),cur=EG.value||(CF['default']&&CF['default'].grade)||'2',h='',k;
 var univ=EX.value==='univ';
 for(k in g){if(univ?k!=='univ':k==='univ')continue;h+='<option value="'+esc(k)+'">'+esc(g[k].label)+'</option>';}
 EG.innerHTML=h;if(univ)EG.value='univ';else if(g[cur]&&cur!=='univ')EG.value=cur;
 var curT=ET.value||(CF['default']&&CF['default'].format)||'';
 var list=(g[EG.value]||{}).formats||[],th='';
 for(var i=0;i<list.length;i++){var fm=f[list[i]]||{};var lab=fm.type?TYPE_LABEL[fm.type]||list[i]:(fm.label||list[i]);th+='<option value="'+esc(list[i])+'"'+(fm.phase===2?' disabled':'')+'>'+esc(lab)+(fm.phase===2?'（準備中）':'')+'</option>';}
 ET.innerHTML=th;
 var okT=false;for(var j=0;j<ET.options.length;j++){if(ET.options[j].value===curT&&!ET.options[j].disabled){okT=true;}}
 if(okT)ET.value=curT;else{for(var q=0;q<ET.options.length;q++){if(!ET.options[q].disabled){ET.value=ET.options[q].value;break;}}}
 onModeChange();
}
function fmtKey(){return EX.value==='practice'?'FR':(ET.value||'2O');}
function fmtType(){var fm=F()[fmtKey()]||{};return fm.type||'free';}
function wordsRange(){
 var lo=parseInt(EMIN.value,10),hi=parseInt(EMAX.value,10);
 if(!isNaN(lo)&&!isNaN(hi)&&hi>=lo&&hi>0)return [lo,hi];
 var fm=F()[fmtKey()];return fm&&fm.words?fm.words:null;
}
var LASTFMT='';
function onModeChange(){
 var pr=EX.value==='practice',univ=EX.value==='univ',type=fmtType(),k=fmtKey();
 /* 形式が変わったら語数の上書きは捨てる（大学入試の自由英作文だけは志望校の指定として残す） */
 if(LASTFMT&&k!==LASTFMT&&!(F()[k]||{}).custom){EMIN.value='';EMAX.value='';}
 LASTFMT=k;
 show('ewc-f-grade',!pr&&!univ);show('ewc-f-type',!pr);
 var W=wordsRange(),fm=F()[k]||{},rg=D('ewc-range');
 if(rg){
  if(fm.custom&&!(EMIN.value&&EMAX.value))rg.innerHTML='任意<small>詳細設定で志望校の語数を入力できます（初期値 '+fm.words[0]+'〜'+fm.words[1]+'語）</small>';
  else rg.innerHTML=W?(W[0]+'〜'+W[1]+'語'+(fm.src?'<small>出典：'+esc(fm.src)+'</small>':'')):'指定なし<small>語数は採点しません</small>';
 }
 /* お題ボックスの出し分け */
 show('ewc-topicbox',type!=='free');
 show('ewc-f-topic',type==='opinion'||type==='free_essay');
 show('ewc-f-src',type==='email'||type==='summary'||type==='trans');
 show('ewc-f-name',type==='email');
 show('ewc-f-points',/^(2O|P1O)$/.test(k));
 var tl=D('ewc-topic-label'),sl=D('ewc-src-label'),sh=D('ewc-src-hint');
 if(tl)tl.textContent=type==='email'?'相手のEメール':type==='summary'?'要約する原文':type==='trans'?'日本語の原文':'お題（TOPIC / QUESTION）';
 if(sl)sl.textContent=type==='email'?'相手のEメール（本文を貼りつけ）':type==='summary'?'原文（要約する英文）':'日本語の原文';
 if(sh)sh.textContent=type==='email'?'貼っておくと、質問に答えているかの目安を出します。':type==='summary'?'貼っておくと、原文との一致率と写した文を判定します。':type==='trans'?'貼っておくと、文の数と数字の対応を確かめます。':'';
 if(ESRC)ESRC.placeholder=type==='email'?'Hi,\nThank you for your e-mail. ...':type==='summary'?'（要約問題の英文を貼りつけます）':'（和文英訳の日本語を貼りつけます）';
 timerSetup();meter();saveDraft();
}
EX.addEventListener('change',function(){fillSelects();});
EG.addEventListener('change',function(){ET.value='';fillSelects();});
ET.addEventListener('change',onModeChange);
EMIN.addEventListener('input',onModeChange);EMAX.addEventListener('input',onModeChange);
ETOP.addEventListener('input',saveDraft);EPT.addEventListener('input',saveDraft);if(ESRC)ESRC.addEventListener('input',saveDraft);if(ENAME)ENAME.addEventListener('input',saveDraft);

/* ---------- 語数カウンター（入力を間引く） ---------- */
var mtimer=null;
function meter(){
 var n=EWC_ENGINE.countWords(TA.value,fmtType()),W=wordsRange(),st='';
 if(W){var edge=5;if(n<W[0]-edge||n>W[1]+edge)st='out';else if(n<W[0]||n>W[1])st='edge';else st='in';}
 WC.textContent=n+' 語'+(W?(' / '+W[0]+'〜'+W[1]):'');
 WC.className='ewc-wc'+(W?' '+st:'');
 BAR.className='ewc-bar'+(W?' '+st:'');
 var fill=BAR.getElementsByTagName('i')[0],mlo=D('ewc-mlo'),mhi=D('ewc-mhi');
 if(W){var max=W[1]*1.3;fill.style.width=Math.min(100,n/max*100)+'%';mlo.style.display=mhi.style.display='block';mlo.style.left=(W[0]/max*100)+'%';mhi.style.left=(W[1]/max*100)+'%';}
 else{fill.style.width=Math.min(100,n/200*100)+'%';mlo.style.display=mhi.style.display='none';}
 RUN.disabled=(n<3);
}
TA.addEventListener('input',function(){clearTimeout(mtimer);mtimer=setTimeout(function(){meter();saveDraft();},120);});

/* ---------- 下書きの自動保存 ---------- */
var dtimer=null;
function saveDraft(){clearTimeout(dtimer);dtimer=setTimeout(function(){LS.s('wc_draft',{t:TA.value,ex:EX.value,g:EG.value,f:ET.value,topic:ETOP.value,pts:EPT.value,lo:EMIN.value,hi:EMAX.value,src:ESRC?ESRC.value:'',name:ENAME?ENAME.value:'',at:Date.now()});},800);}
function restoreDraft(){
 var d=LS.g('wc_draft',null);if(!d||!d.at||Date.now()-d.at>7*864e5)return false;
 if(d.ex)EX.value=d.ex;if(d.g)EG.value=d.g;fillSelects();if(d.f){for(var i=0;i<ET.options.length;i++)if(ET.options[i].value===d.f&&!ET.options[i].disabled)ET.value=d.f;}
 ETOP.value=d.topic||'';EPT.value=d.pts||'';EMIN.value=d.lo||'';EMAX.value=d.hi||'';if(ESRC)ESRC.value=d.src||'';if(ENAME)ENAME.value=d.name||'';
 if(d.t&&!TA.value)TA.value=d.t;
 onModeChange();return true;
}

/* ---------- タイマー（任意） ---------- */
var TM={on:false,left:0,iv:null};
function timerSetup(){
 var el=D('ewc-timer');if(!el||!(CF.show&&CF.show.timer)){if(el)el.innerHTML='';return;}
 var fm=F()[fmtKey()]||{},min=fm.minutes||0;
 if(!min){el.innerHTML='';TM.on=false;clearInterval(TM.iv);return;}
 if(!TM.on)el.innerHTML='<button type="button" id="ewc-tstart" aria-label="タイマーを開始">&#x23f1; '+min+'分で始める</button>';
 var b=D('ewc-tstart');if(b)b.addEventListener('click',function(){timerStart(min);});
}
function timerStart(min){
 TM.on=true;TM.left=min*60;clearInterval(TM.iv);
 var el=D('ewc-timer');
 function tick(){var m=Math.floor(TM.left/60),s=TM.left%60;el.className='ewc-timer'+(TM.left<=60?' warn':'');el.innerHTML='<b>'+m+':'+(s<10?'0':'')+s+'</b><button type="button" id="ewc-tstop" aria-label="タイマーを止める">止める</button>';var sb=D('ewc-tstop');if(sb)sb.addEventListener('click',function(){TM.on=false;clearInterval(TM.iv);timerSetup();});if(TM.left<=0){clearInterval(TM.iv);el.innerHTML='<b>時間です</b><button type="button" id="ewc-tstop">閉じる</button>';var cb=D('ewc-tstop');if(cb)cb.addEventListener('click',function(){TM.on=false;timerSetup();});return;}TM.left--;}
 tick();TM.iv=setInterval(tick,1000);
}

/* ---------- 実行 ---------- */
var LAST=null,PREV=null,UNDO=[],RUNS=0,STALL=0,FLAGGED={},FILT='all',SESSION_FMT='';
function opts(){
 var pts=String(EPT.value||'').split(/[,、，]/).map(function(s){return s.trim();}).filter(Boolean);
 return {format:fmtKey(),topic:ETOP.value||'',points:pts,words:(EMIN.value&&EMAX.value)?wordsRange():null,source:ESRC?ESRC.value:'',name:ENAME?ENAME.value:''};
}
function run(silent){
 var text=TA.value;
 if(EWC_ENGINE.countWords(text,fmtType())<3)return;
 setStatus(ENG?'':'項目の定義を読み込んでいます…');
 RUN.disabled=true;
 loadData().then(function(){
  var o=opts(),t0=Date.now(),res=ENG.check(text,o);
  RUN.disabled=false;setStatus('');
  if(!silent){PREV=LAST;RUNS++;}
  LAST=res;LAST.opt=o;LAST.ms=Date.now()-t0;
  if(SESSION_FMT!==o.format){SESSION_FMT=o.format;RUNS=1;PREV=null;}
  render(res,o,!!silent);
  if(!silent){save(res,o);report(res,o);}
  loadNlp();
 })['catch'](function(e){RUN.disabled=false;setStatus('項目の定義を読み込めませんでした。時間をおいてもう一度お試しください。');});
}
function setStatus(s){var e=D('ewc-status');if(e)e.textContent=s;}
RUN.addEventListener('click',function(){run(false);});

/* ---------- 描画 ---------- */
function render(res,o,silent){
 FLAGGED={};
 /* 語数の警告帯 */
 var b=res.band,bd=D('ewc-band');
 if(b&&b.state!=='in'){bd.className='ewc-band'+(b.state==='edge'?' edge':'');bd.innerHTML=(b.state==='out'?'語数が範囲外です':'語数が範囲の端ぎりぎりです')+'　'+b.n+'語（目安 '+b.lo+'〜'+b.hi+'語）<small>'+(b.n<b.lo?'あと'+(b.lo-b.n)+'語書きます。':(b.n-b.hi)+'語削ります。')+'</small>';show('ewc-band',true);}
 else show('ewc-band',false);
 /* 観点 */
 var sp=CF.sponsor||{},slot=(sp.slots||{}).content||{},h='<div class="ewc-axh">形式チェックの目安（0〜4）</div>';
 if(spOn('content'))h+='<div class="ewc-ax-content"><span style="font-weight:700;color:var(--ewc-ink)">内容</span><span>'+prTag()+''+esc(slot.t||'内容の採点は、AI採点サービスで受けられます')+'　<a href="'+esc(spUrl('content'))+'" target="_blank" rel="sponsored noopener" data-slot="content">'+esc(slot.btn||sp.name||'AI採点へ')+' →</a></span></div>';
 else h+='<div class="ewc-ax-content"><span style="font-weight:700;color:var(--ewc-ink)">内容</span><span>このツールでは判定しません。</span></div>';
 var ks=['kos','goi','bun'];
 for(var i=0;i<ks.length;i++){var v=res.axes[ks[i]];h+='<div class="ewc-ax c'+(v<=1?1:v<=2?2:v<=3?3:4)+'"><span>'+AXN[ks[i]]+'</span><i><u style="width:'+(v/4*100)+'%"></u></i><b>'+v+'<small> / 4</small></b></div>';}
 put('ewc-axes',h);if(spOn('content'))beacon('sponsor',{ev:'view',slots:['content']});
 /* 差分 */
 var dh='';
 if(PREV&&!silent){
  var gone=0,pk={},j;for(j=0;j<PREV.findings.length;j++)pk[PREV.findings[j].id]=1;
  var now={};for(j=0;j<res.findings.length;j++)now[res.findings[j].id]=1;
  for(var k in pk)if(!now[k])gone++;
  dh+='<span>前回比</span>';
  for(i=0;i<ks.length;i++){var d=res.axes[ks[i]]-PREV.axes[ks[i]];dh+='<span>'+AXN[ks[i]]+' <em class="'+(d>0?'up':d<0?'dn':'')+'">'+(d>0?'+'+d:d)+'</em></span>';}
  dh+='<span>消えた指摘 <em class="'+(gone?'up':'')+'">'+gone+'</em></span>';
  var sum=function(a){return a.kos+a.goi+a.bun;};
  STALL=(sum(res.axes)===sum(PREV.axes)&&res.findings.length>=PREV.findings.length)?STALL+1:0;
 }
 put('ewc-diff',dh);
 /* 本文 */
 HL.innerHTML=buildHL(res.text,res.hits)||'<span style="color:var(--ewc-mut)">本文がありません。</span>';
 /* 数値 */
 var m=res.metrics,nums=[['語数',m.words,'語'],['文の数',m.sentences,''],['平均文長',m.avgLen,'語'],['最長の文',m.maxLen,'語'],['語彙の多様性',m.ttr,''],['段落',m.paragraphs,'']],nh='';
 for(i=0;i<nums.length;i++)nh+='<div class="ewc-num"><span>'+nums[i][0]+'</span><b>'+nums[i][1]+'<small>'+nums[i][2]+'</small></b></div>';
 if(m.connectors){var cn=m.connectors,cl={add:'追加',contrast:'対比',cause:'因果',example:'例示',conclude:'結論'},cs='';for(var ck in cl)cs+=cl[ck]+' '+(cn[ck]||0)+'　';nh+='<div class="ewc-num" style="grid-column:1/-1"><span>接続表現の種類（'+(m.connectorsTotal||0)+'語）</span><b style="font-size:13px;font-weight:400">'+esc(cs.trim())+'</b></div>';}
 put('ewc-nums',nh);
 renderSpecial(res,o);
 /* カード */
 FILT='all';var tabs=D('ewc-tabs').getElementsByTagName('button');for(i=0;i<tabs.length;i++)tabs[i].className='ewc-tab'+(tabs[i].getAttribute('data-f')==='all'?' on':'');
 renderList();
 show('ewc-undo',UNDO.length>0);
 renderNext(res,o);
 renderHist();
 RES.className='ewc-res';
 if(!silent)setTimeout(function(){RES.scrollIntoView({behavior:'smooth',block:'start'});},60);
}
function buildHL(t,H){
 var word=[],wide=[],i,j;
 for(i=0;i<H.length;i++){(H[i].wide?wide:word).push(H[i]);}
 var cmp=function(a,b){return a.s-b.s||b.e-a.e;};word.sort(cmp);wide.sort(cmp);
 var W=[],pos=0;for(i=0;i<word.length;i++){var h=word[i];if(h.s<pos||h.e<=h.s)continue;W.push(h);pos=h.e;}
 var extra=[],wpos=0;
 for(i=0;i<wide.length;i++){var g=wide[i],cur=Math.max(g.s,wpos);if(cur>=g.e)continue;
  for(j=0;j<W.length;j++){var w=W[j];if(w.e<=cur)continue;if(w.s>=g.e)break;if(w.s>cur)extra.push({s:cur,e:Math.min(w.s,g.e),rid:g.rid,sev:g.sev,wide:1});cur=Math.max(cur,w.e);if(cur>=g.e)break;}
  if(cur<g.e)extra.push({s:cur,e:g.e,rid:g.rid,sev:g.sev,wide:1});wpos=g.e;}
 var all=W.concat(extra).sort(cmp),out='',p2=0;
 for(i=0;i<all.length;i++){var a=all[i];if(a.s<p2||a.e<=a.s)continue;out+=esc(t.slice(p2,a.s));out+='<mark class="m'+a.sev+(a.wide?' wide':'')+'" data-rid="'+esc(a.rid)+'" tabindex="0" role="button" aria-label="指摘を見る">'+esc(t.slice(a.s,a.e))+'</mark>';p2=a.e;}
 return out+esc(t.slice(p2));
}
function renderList(){
 if(!LAST)return;
 var F=LAST.findings.slice(),show_=[],i;
 for(i=0;i<F.length;i++){if(!F[i].sev)continue;if(FILT==='all'||F[i].sev===parseInt(FILT,10))show_.push(F[i]);}
 show_.sort(function(a,b){return b.sev-a.sev;});
 if(!show_.length){
  var crit=LAST.findings.some(function(f){return f.sev===3;});
  LIST.innerHTML='<div class="ewc-empty'+(FILT==='all'?' ok':'')+'">'+(FILT==='all'?'基本ミスは見つかりませんでした。':'この区分の指摘はありません。')+'</div>';return;
 }
 var canFlag=(CF.show&&CF.show.flag!==0)&&CF.api&&CF.log,h='';
 for(i=0;i<show_.length;i++){
  var f=show_[i];
  h+='<div class="ewc-item s'+f.sev+'" data-rid="'+esc(f.id)+'" id="ewc-card-'+esc(f.id)+'">';
  h+='<div class="ewc-ihd"><span class="ewc-sev">'+SEVN[f.sev]+'</span><span class="ewc-iname">'+esc(f.name)+'</span><span class="ewc-icat">'+esc(f.cat)+' ／ '+AXN[f.ax]+(f.n>1?'　'+f.n+'か所':'')+'</span></div>';
  if(f.det)h+='<p class="ewc-idet">'+esc(f.det)+'</p>';
  var hs=f.hits.filter(function(x){return x.t;}),hh='';
  for(var j=0;j<hs.length&&j<6;j++){hh+='<code>'+esc(hs[j].t)+(hs[j].fix!=null&&hs[j].fix!==hs[j].t?' → <b>'+esc(hs[j].fix===''?'（削除）':hs[j].fix)+'</b>':(hs[j].good?' → <b>'+esc(hs[j].good)+'</b>':''))+'</code>';}
  if(hs.length>6)hh+='<code>ほか'+(hs.length-6)+'か所</code>';
  if(hh)h+='<div class="ewc-ihits">'+hh+'</div>';
  if(f.why)h+='<p class="ewc-iwhy"><b>なぜ</b>　'+esc(f.why)+'</p>';
  if(f.example)h+='<p class="ewc-iex">例：<b>'+esc(f.example)+'</b></p>';
  h+='<div class="ewc-ift ewc-noprint">';
  if(f.quest&&CF.quest)h+='<a class="ewc-quest" href="'+esc(questUrl(f.quest))+'" target="_blank" rel="noopener">この文法を復習する（'+esc(f.quest)+'）</a>';
  if(canFlag)h+='<button type="button" class="ewc-flag" data-rid="'+esc(f.id)+'"'+(FLAGGED[f.id]?' disabled':'')+'>'+(FLAGGED[f.id]?'送信しました':'この指摘は違う')+'</button>';
  if(f.fixable)h+='<button type="button" class="ewc-fix" data-rid="'+esc(f.id)+'">この修正を適用'+(f.n>1?'（'+f.hits.filter(function(x){return x.fix!=null;}).length+'か所）':'')+'</button>';
  h+='</div></div>';
 }
 LIST.innerHTML=h;
}
/* 修正の適用と取り消し */
function applyFix(rid){
 if(!LAST||!ENG)return;
 var f=null;for(var i=0;i<LAST.findings.length;i++)if(LAST.findings[i].id===rid){f=LAST.findings[i];break;}
 if(!f)return;
 var before=TA.value,after=ENG.applyFix(LAST.text,f.hits);
 if(after===LAST.text)return;
 UNDO.push({text:before,rid:rid,name:f.name});if(UNDO.length>20)UNDO.shift();
 TA.value=after;meter();saveDraft();
 beacon('fix',{rid:rid,fmt:LAST.opt?LAST.opt.format:''});
 run(false);
 var um=D('ewc-undo-msg');if(um)um.textContent='「'+f.name+'」の修正を適用しました。';
}
D('ewc-undo-btn').addEventListener('click',function(){
 var u=UNDO.pop();if(!u)return;TA.value=u.text;meter();saveDraft();run(false);
 var um=D('ewc-undo-msg');if(um)um.textContent='「'+u.name+'」の修正を取り消しました。';
 show('ewc-undo',UNDO.length>0);
});
LIST.addEventListener('click',function(e){
 var t=e.target;while(t&&t!==this&&!(t.classList&&(t.classList.contains('ewc-fix')||t.classList.contains('ewc-flag')||t.classList.contains('ewc-item'))))t=t.parentNode;
 if(!t||t===this)return;
 if(t.classList.contains('ewc-fix')){applyFix(t.getAttribute('data-rid'));return;}
 if(t.classList.contains('ewc-flag')){var rid=t.getAttribute('data-rid');if(!FLAGGED[rid]){FLAGGED[rid]=1;beacon('flag',{rid:rid,fmt:LAST&&LAST.opt?LAST.opt.format:''});t.disabled=true;t.textContent='送信しました';}return;}
 flash(t.getAttribute('data-rid'));
});
D('ewc-tabs').addEventListener('click',function(e){
 var b=e.target;while(b&&b!==this&&!(b.classList&&b.classList.contains('ewc-tab')))b=b.parentNode;
 if(!b||b===this)return;FILT=b.getAttribute('data-f');
 var tabs=this.getElementsByTagName('button');for(var i=0;i<tabs.length;i++)tabs[i].className='ewc-tab'+(tabs[i]===b?' on':'');
 renderList();
});
function flash(rid){
 var ms=HL.querySelectorAll('mark[data-rid="'+rid+'"]');if(!ms.length)return;
 HL.scrollIntoView({behavior:'smooth',block:'center'});HL.scrollTop=Math.max(0,ms[0].offsetTop-HL.clientHeight/2);
 for(var i=0;i<ms.length;i++)ms[i].className+=' hit';
 setTimeout(function(){for(var k=0;k<ms.length;k++)ms[k].className=ms[k].className.replace(/ hit/g,'');},1400);
}
function openCard(rid){
 FILT='all';var tabs=D('ewc-tabs').getElementsByTagName('button');for(var i=0;i<tabs.length;i++)tabs[i].className='ewc-tab'+(tabs[i].getAttribute('data-f')==='all'?' on':'');
 renderList();
 var c=D('ewc-card-'+rid);if(!c)return;c.scrollIntoView({behavior:'smooth',block:'center'});c.className+=' focus';setTimeout(function(){c.className=c.className.replace(/ focus/g,'');},1600);
}
HL.addEventListener('click',function(e){var m=e.target;if(m&&m.tagName==='MARK')openCard(m.getAttribute('data-rid'));});
HL.addEventListener('keydown',function(e){var m=e.target;if(m&&m.tagName==='MARK'&&(e.key==='Enter'||e.key===' ')){e.preventDefault();openCard(m.getAttribute('data-rid'));}});

/* ---------- 形式ごとの追加表示（要約の一致率・Eメールの質問数・和文英訳の対応） ---------- */
function renderSpecial(res,o){
 var el=D('ewc-special');if(!el)return;
 var m=res.metrics,type=fmtType(),h='',sp=CF.sponsor||{},sl=sp.slots||{};
 if(type==='summary'){
  if(m.overlap!=null){
   var cfg=(F()[o.format]||{}).overlap||{warn:30,crit:50},c=m.overlap>cfg.crit?3:m.overlap>cfg.warn?2:1;
   h+='<div class="ewc-sp c'+c+'"><div class="ewc-sp-t">原文との一致率（4語以上の連続一致）</div><b class="big">'+m.overlap+'<small>%</small></b><span>'+(c===3?'半分以上が原文の写しです。自分の言葉で言い換えます。':c===2?'目安（'+cfg.warn+'％以下）を超えています。長い一致を言い換えます。':'目安の範囲内です。')+'　本文の点線の下線が一致した部分です。</span>'
    +(spOn('summary')?'<div class="ewc-sp-pr">'+prTag()+''+esc(sl.summary.t)+'　<a href="'+esc(spUrl('summary'))+'" target="_blank" rel="sponsored noopener" data-slot="summary">'+esc(sl.summary.btn||sp.name)+' →</a></div>':'')+'</div>';
   if(spOn('summary'))beacon('sponsor',{ev:'view',slots:['summary']});
  }else h+='<div class="ewc-sp c1"><div class="ewc-sp-t">原文との一致率</div><b class="big">—</b><span>「要約する原文」欄に英文を貼ると、一致率と写した文を判定します。</span></div>';
 }
 if(type==='email'){
  if(m.questions!=null)h+='<div class="ewc-sp c'+(m.questions===2?1:m.questions<2?3:2)+'"><div class="ewc-sp-t">質問の数</div><b class="big">'+m.questions+'<small>つ</small></b><span>準2級は下線部について質問を2つ書きます。</span></div>';
  if(m.asked!=null)h+='<div class="ewc-sp c'+(m.answered===m.asked?1:2)+'"><div class="ewc-sp-t">相手の質問への答え（目安）</div><b class="big">'+m.answered+'<small> / '+m.asked+'</small></b><span>質問の語を使って答えると、答えたことが伝わります。内容の正しさは判定していません。</span></div>';
 }
 if(type==='trans'&&m.jpSentences!=null){
  h+='<div class="ewc-sp c'+(m.jpSentences===m.sentences?1:2)+'"><div class="ewc-sp-t">文の数の対応（目安）</div><b class="big">'+m.jpSentences+'<small> → '+m.sentences+'</small></b><span>日本語'+m.jpSentences+'文に対して英文'+m.sentences+'文です。'+(m.jpNumbers?'原文の数字 '+m.jpNumbers+'個のうち、英文に見当たらないもの '+((m.missingNumbers||[]).length)+'個。':'')+'</span></div>';
 }
 el.innerHTML=h;
 /* 要約：一致した部分を点線で示す */
 if(type==='summary'&&m.overlapRuns&&m.overlapRuns.length&&HL){
  var marks=HL.querySelectorAll('mark[data-rid="a_sum_overlap"]');for(var i=0;i<marks.length;i++)marks[i].className+=' ov';
 }
}
D('ewc-special').addEventListener('click',function(e){var a=e.target;if(a&&a.tagName==='A'&&a.getAttribute('data-slot'))beacon('sponsor',{ev:'click',slots:[a.getAttribute('data-slot')]});});

/* ---------- お題（ランダム） ---------- */
var TOPICS=null,TLOAD=null;
/* v1.2：お題は英作文テーマ生成メーカーと共有する一覧（etm-index）を優先して読む。読めなければ従来の ewc-topics を使う */
var ETM=CF.etm||{};
var UNIV_W={1:[60,80],2:[100,120],3:[120,150]};
var EX2FMT={opinion:{univ:'UF',eiken_3:'3O',eiken_p2:'P2O',eiken_p2p:'P2PO',eiken_2:'2O',eiken_p1:'P1O'},email:{eiken_3:'3E',eiken_p2:'P2E'},summary:{eiken_p2p:'P2PS',eiken_2:'2S',eiken_p1:'P1S'},translation:{univ:'UT'}};
EX2FMT.choice=EX2FMT.opinion;EX2FMT.explain=EX2FMT.opinion;
function fromShared(t){
 var out=[],m=t.material||{},map=EX2FMT[t.format]||{};
 (t.exams||[]).forEach(function(x){var code=map[x];if(!code)return;
  var o={id:t.id,alias:t.alias||[],format:code,exam:x,model:['opinion','choice','explain','email'].indexOf(t.format)>=0};
  if(code==='UF'){o.topic=t.prompt_en;o.words=t.words?[t.words.min,t.words.max]:(UNIV_W[t.difficulty]||UNIV_W[2]);}
  else if(/O$/.test(code)){o.topic=t.prompt_en;o.points=t.points||[];}
  if(t.format==='email'){o.email=m.text||'';o.name=m.name||'';o.underline=m.underline||'';}
  if(t.format==='summary')o.passage=m.passage||'';
  if(t.format==='translation')o.jp=m.source_ja||'';
  out.push(o);});
 return out;
}
function loadTopics(){
 if(TLOAD)return TLOAD;
 function own(){return fetch(dataUrl('ewc-topics-v'+(CF.vfile||'1-0')+'.json')).then(function(r){if(!r.ok)throw new Error('topics');return r.json();}).then(function(j){TOPICS=j.topics||[];return TOPICS;});}
 TLOAD=(ETM.index?fetch(ETM.index).then(function(r){if(!r.ok)throw new Error('etm');return r.json();}).then(function(j){var l=[];(j.topics||[]).forEach(function(t){l=l.concat(fromShared(t));});if(!l.length)throw new Error('empty');TOPICS=l;return l;})['catch'](own):own());
 TLOAD['catch'](function(){TLOAD=null;});
 return TLOAD;
}
function topicMatch(t,id){return t.id===id||(t.alias||[]).indexOf(id)>=0;}
var CUR_TID='';
function setTopic(t){
 var type=fmtType();
 if(type==='opinion'||type==='free_essay'){ETOP.value=t.topic||'';EPT.value=(t.points||[]).join(', ');if(t.words&&type==='free_essay'){EMIN.value=t.words[0];EMAX.value=t.words[1];}}
 else if(type==='email'){if(ESRC)ESRC.value=t.email||'';if(ENAME)ENAME.value=t.name||'';ETOP.value='';}
 else if(type==='summary'){if(ESRC)ESRC.value=t.passage||'';ETOP.value='';}
 else if(type==='trans'){if(ESRC)ESRC.value=t.jp||'';ETOP.value='';}
 CUR_TID=t.id||'';onModeChange();saveDraft();
}
ETOP.addEventListener('input',function(){CUR_TID='';});if(ESRC)ESRC.addEventListener('input',function(){CUR_TID='';});
D('ewc-random').addEventListener('click',function(){
 var b=this,k=fmtKey(),o=b.textContent;b.textContent='読み込み中…';b.disabled=true;
 loadTopics().then(function(list){
  b.textContent=o;b.disabled=false;
  var pool=list.filter(function(t){return t.format===k;});
  if(!pool.length){setStatus('この形式のお題はまだありません。');return;}
  var t=pool[Math.floor(Math.random()*pool.length)];
  setTopic(t);beacon('ui',{k:'random',fmt:k});
  var sp=CF.sponsor||{},s=(sp.slots||{}).topic,pr=D('ewc-topic-pr');
  if(pr){if(spOn('topic')){pr.innerHTML=''+prTag()+''+esc(s.t)+'　<a href="'+esc(spUrl('topic'))+'" target="_blank" rel="sponsored noopener" data-slot="topic">'+esc(s.btn||sp.name)+' →</a>';show('ewc-topic-pr',true);beacon('sponsor',{ev:'view',slots:['topic']});}else show('ewc-topic-pr',false);}
  TA.focus();
 })['catch'](function(){b.textContent=o;b.disabled=false;setStatus('お題を読み込めませんでした。');});
});
D('ewc-topic-pr').addEventListener('click',function(e){if(e.target.tagName==='A')beacon('sponsor',{ev:'click',slots:['topic']});});

/* ---------- 次の一手（スポンサー枠は PR 表記つき） ---------- */
function spBase(slot){var sp=CF.sponsor||{},sl=(sp.slots||{})[slot]||{};return String(sl.u||sp.url||'');}
function spOn(slot){var sp=CF.sponsor||{},sl=(sp.slots||{})[slot];return !!(sp.on&&sl&&sl.on&&spBase(slot));}
function spUrl(slot){var u=spBase(slot);if(!u)return '';return u+(u.indexOf('?')>=0?'&':'?')+'utm_source=bunkeilab&utm_medium=tool&utm_campaign=ewc&utm_content='+encodeURIComponent(slot);}
function prTag(){return '<em class="ewc-pr">'+esc((CF.sponsor||{}).pr||'PR')+'</em>';}
function questUrl(label){var u=String(CF.quest||'');if(!u)return '';if(u.indexOf('{quest}')>=0)return u.replace('{quest}',encodeURIComponent(label||''));return u;}
function renderNext(res,o){
 var sp=CF.sponsor||{},sl=sp.slots||{},h='',crit=res.findings.some(function(f){return f.sev===3;}),shown=[];
 function card(slot,extraCls){var s=sl[slot];if(!spOn(slot))return;h+='<a class="ewc-card" href="'+esc(spUrl(slot))+'" target="_blank" rel="sponsored noopener" data-slot="'+slot+'">'+prTag()+'<b>'+esc(s.t)+'</b><span>'+esc(s.b||'')+'</span><i>'+esc(s.btn||sp.name)+' →</i></a>';shown.push(slot);}
 if(!crit)card('zero');
 if(STALL>=2&&RUNS>=3)card('stall');
 if(/^EW-\d{4}$/.test(CUR_TID)&&TOPICS){var tt=null;for(var ti=0;ti<TOPICS.length;ti++)if(TOPICS[ti].id===CUR_TID&&TOPICS[ti].format===fmtKey()){tt=TOPICS[ti];break;}var ml=tt&&tt.model?makerLink(tt.id,tt.exam):'';if(ml)h+='<a class="ewc-card" href="'+esc(ml)+'"><b>このお題の模範解答を見る</b><span>英作文テーマ生成メーカーで、段階ヒントと模範解答（和訳つき）を確かめられます</span><i>模範解答へ →</i></a>';}
 if(sp.review)h+='<a class="ewc-card" href="'+esc(sp.review)+'"><b>'+esc(sp.review_t||'AI採点サービスを比べてから決めたい')+'</b><span>'+esc(sp.review_b||((sp.name||'UGUIS.AI')+'のレビュー記事（料金・使い方・向いている人）'))+'</span><i>記事を読む →</i></a>';
 if(CF.quest){var qs={};for(var i=0;i<res.findings.length;i++)if(res.findings[i].sev&&res.findings[i].quest)qs[res.findings[i].quest]=1;var ql=Object.keys(qs);if(ql.length)h+='<a class="ewc-card" href="'+esc(questUrl(ql.length===1?ql[0]:''))+'" target="_blank" rel="noopener"><b>出た文法ミスを問題で復習する</b><span>英文法クエスト：'+esc(ql.slice(0,3).join('・'))+'</span><i>復習する →</i></a>';}
 put('ewc-cta',h);show('ewc-sec-next',!!h);
 if(shown.length)beacon('sponsor',{ev:'view',slots:shown});
}
D('ewc-cta').addEventListener('click',function(e){var a=e.target;while(a&&a!==this&&a.tagName!=='A')a=a.parentNode;if(!a||a===this)return;var s=a.getAttribute('data-slot');if(s)beacon('sponsor',{ev:'click',slots:[s]});});
D('ewc-axes').addEventListener('click',function(e){var a=e.target;if(a&&a.tagName==='A'&&a.getAttribute('data-slot'))beacon('sponsor',{ev:'click',slots:[a.getAttribute('data-slot')]});});
(function handSlot(){var sp=CF.sponsor||{},s=(sp.slots||{}).hand;if(!spOn('hand'))return;put('ewc-hand',''+prTag()+''+esc(s.t)+'　<a href="'+esc(spUrl('hand'))+'" target="_blank" rel="sponsored noopener" data-slot="hand">'+esc(s.btn||'くわしく')+' →</a>');show('ewc-hand',true);D('ewc-hand').addEventListener('click',function(e){if(e.target.tagName==='A')beacon('sponsor',{ev:'click',slots:['hand']});});beacon('sponsor',{ev:'view',slots:['hand']});})();

/* ---------- 送信（本文は送らない） ---------- */
function sid(){var v=LS.g('wc_sid','');if(!v){v='';for(var i=0;i<16;i++)v+='0123456789abcdef'.charAt(Math.floor(Math.random()*16));LS.s('wc_sid',v);}return v;}
function beacon(path,body){
 if(!CF.api||!CF.log)return;
 body.nonce=CF.nonce||'';body.sid=sid();
 var url=CF.api+path,json=JSON.stringify(body);
 try{if(navigator.sendBeacon){navigator.sendBeacon(url,new Blob([json],{type:'application/json'}));}else if(window.fetch){fetch(url,{method:'POST',headers:{'Content-Type':'application/json'},body:json,keepalive:true})['catch'](function(){});}}catch(e){}
}
function report(res,o){
 var rules={},i;for(i=0;i<res.findings.length;i++)if(res.findings[i].sev)rules[res.findings[i].id]=res.findings[i].n||1;
 beacon('log',{fmt:o.format,band:Math.floor(res.words/10)*10,axes:res.axes,rules:rules,rerun:RUNS>1?1:0,crit:res.findings.filter(function(f){return f.sev===3;}).length,pid:CF.pid||0,nlp:res.nlp?1:0,ms:LAST.ms||0});
}

/* ---------- 端末内の記録（学習ナビ形式 wc_stats / wc_days / wc_meta） ---------- */
function dKey(d){return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();}
function streakOf(days){var s=0,d=new Date();for(var i=0;i<3660;i++){var k=dKey(d);if(days[k]&&days[k].n>0){s++;d.setDate(d.getDate()-1);}else break;}return s;}
function save(res,o){
 var st=LS.g('wc_stats',{}),i,seen={};
 for(i=0;i<res.findings.length;i++){var f=res.findings[i];if(!f.sev)continue;var r=st[f.id]||{n:0,l:0};r.l=1;st[f.id]=r;seen[f.id]=1;}
 var all=ENG?ENG.rules:[];for(i=0;i<all.length;i++){var id=all[i].id;if(!ENG.ruleOn(all[i],o.format)||!ENG.rv(all[i].sev,o.format))continue;if(seen[id])continue;var q=st[id]||{n:0,l:0};q.n=(q.n||0)+1;q.l=0;st[id]=q;}
 LS.s('wc_stats',st);
 var today=new Date(),days=LS.g('wc_days',{}),k=dKey(today);days[k]=days[k]||{n:0};days[k].n=(days[k].n||0)+1;LS.s('wc_days',days);
 var mt=LS.g('wc_meta',{runs:0,streak:0});mt.runs=(mt.runs||0)+1;mt.streak=streakOf(days);mt.last=k;LS.s('wc_meta',mt);
 var hs=LS.g('wc_hist',[]);hs.unshift({t:Date.now(),f:o.format,w:res.words,a:res.axes,c:res.findings.filter(function(x){return x.sev===3;}).length,n:res.findings.filter(function(x){return x.sev;}).length});
 if(hs.length>30)hs=hs.slice(0,30);LS.s('wc_hist',hs);
}
function renderHist(){
 var el=D('ewc-hist');if(!el)return;
 var hs=LS.g('wc_hist',[]),h='',i,labels=F();
 if(!hs.length){el.innerHTML='<div class="ewc-empty">まだ記録がありません。</div>';return;}
 for(i=0;i<hs.length&&i<8;i++){var d=hs[i],dt=new Date(d.t),sum=d.a.kos+d.a.goi+d.a.bun,ps=(i+1<hs.length)?sum-(hs[i+1].a.kos+hs[i+1].a.goi+hs[i+1].a.bun):null;
  h+='<div class="ewc-hrow"><span>'+(dt.getMonth()+1)+'/'+dt.getDate()+' '+('0'+dt.getHours()).slice(-2)+':'+('0'+dt.getMinutes()).slice(-2)+'　'+esc((labels[d.f]||{}).label||d.f)+'　'+d.w+'語　重大'+d.c+'件</span><b>構成'+d.a.kos+'・語彙'+d.a.goi+'・文法'+d.a.bun+'</b><em class="'+(ps>0?'up':ps<0?'dn':'')+'">'+(ps===null?'—':(ps>0?'+'+ps:ps))+'</em></div>';}
 var mt=LS.g('wc_meta',{});h+='<div class="ewc-hrow" style="border:0"><span>通算'+(mt.runs||0)+'回　連続'+(mt.streak||0)+'日</span><b></b><em></em></div>';
 el.innerHTML=h;
}

/* ---------- その他の操作 ---------- */
D('ewc-clear').addEventListener('click',function(){if(TA.value&&!window.confirm('本文を消します。よろしいですか。'))return;TA.value='';meter();RES.className='ewc-res ewc-hide';LS.r('wc_draft');TA.focus();});
D('ewc-howcount').addEventListener('click',function(){var box=D('ewc-howcount-box'),open=box.classList.contains('ewc-hide');show('ewc-howcount-box',open);this.setAttribute('aria-expanded',open?'true':'false');});
D('ewc-copy').addEventListener('click',function(){
 if(!LAST)return;var lines=[],i;
 for(i=0;i<LAST.findings.length;i++){var f=LAST.findings[i];if(!f.sev)continue;lines.push('【'+SEVN[f.sev]+'】'+f.name+(f.det?'　'+f.det:''));var hs=f.hits.filter(function(x){return x.t;}).slice(0,5).map(function(x){return x.t+(x.fix!=null&&x.fix!==x.t?' → '+(x.fix||'（削除）'):'');});if(hs.length)lines.push('　'+hs.join(' / '));}
 var txt='英作文セルフチェック（構成'+LAST.axes.kos+'・語彙'+LAST.axes.goi+'・文法'+LAST.axes.bun+'／4、'+LAST.words+'語）\n\n'+(lines.join('\n')||'指摘はありませんでした。');
 var b=this,ok=function(){var o=b.textContent;b.textContent='コピーしました';setTimeout(function(){b.textContent=o;},1600);};
 if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(txt).then(ok,function(){window.prompt('コピーしてください',txt);});else window.prompt('コピーしてください',txt);
});
var SAMPLES={
 '2O':{topic:'Some people say that students should do volunteer work. Do you agree with this opinion?',points:'Community, Experience, Time',
  t:"I am agree with this opinion, students should do volunteer work. I have two reasons.\nFirst, volunteer work help people in the community. For example, students can clean parks or help old people. It make the town more better.\nSecond, students can get a lot of experiences. They can learn how to work with kids and adults, they can also learn many things. This is very good for there future.\nfor these reasons, i think students should do volunteer work"},
 'P2O':{topic:'Do you think it is a good idea for students to have part-time jobs?',t:"Yes, I think so. First, students can earn money and buy a stuff they want. Second, they can learn a important skill. They can enjoy to work with many people. So I think part-time jobs are good for students."},
 '3O':{topic:'Which do you like better, summer or winter?',t:"I like summer better. I have two reasons. First, I can swim in the sea. Second, I can eat a ice cream every day. it is very delicious."},
 'P1O':{topic:'Should people who live in cities be required to use public transportation?',points:'Convenience, Costs, Pollution, Safety',
  t:"I think people who live in cities should be required to use public transportation. There is two reasons.\nFirst, it is better for the environment. Cars produce a lot of pollution, and it make the air dirty. If more people uses trains and buses, the air in cities will be cleaner.\nSecond, it saves money. Owning a car cost a lot, including insurance and parking. Many people can't afford it. Public transportation is more cheaper and convenient in big cities.\nFor these reasons, I believe cities should require people to use public transportation."},
 'FR':{t:"Yesterday I go to the library with my friend. We studied for three hour, then we ate a lunch. Its a good day."},
 '3E':{name:'Emma',src:"Hi,\nThank you for your e-mail.\nI heard that you went to a music festival last weekend. I have some questions for you. Which singer did you like the best? And how did you get to the festival?\nYour friend,\nEmma",
  t:"Hi, Emma!\nThank you for your e-mail. I liked Aoi the best. Her songs is beautiful. I went there by a train with my sister. It was very fun.\nBest wishes,"},
 'P2E':{name:'Alex',src:"Hi!\nI joined a new cooking club at my school last month. The club meets every Friday, and we cook dishes from different countries. Last week we made Thai curry. Do you think it is a good idea for schools to have cooking clubs?\nYour friend,\nAlex",
  t:"Your club sounds interesting! I want to know more about it. How many students are in the club. I think cooking clubs is a good idea because students can learn to cook healthy food and enjoy to eat together."},
 '2S':{src:"Many schools in Japan have started to use tablets in class. Teachers say that tablets make lessons more interesting because students can watch videos and search for information quickly. Students can also share their answers with the whole class in a few seconds. However, some parents are worried. They say that children spend too much time looking at screens, and that handwriting skills may become weaker. Some teachers also find it hard to keep students focused when games are only one tap away. Because of these concerns, several schools now limit tablet use to certain subjects and ask students to take notes by hand.",
  t:"Many schools in Japan have started to use tablets in class. Teachers say that tablets make lessons more interesting. However, some parents are worried about screen time and handwriting. I think tablets are useful, so schools should use them more."},
 'UF':{topic:'Some people say that university students should study abroad for at least one year. What do you think? Write your opinion in about 100 words.',words:[80,120],
  t:"I think university students should study abroad. First, they can improve there English. Second, they can learn about a different culture, this is important in the global society. Some people say it cost too much, but many universities offers scholarships. So I agree with this idea."},
 'UT':{src:"私は先週、家族と京都へ旅行に行った。三日間で五つの寺を訪れ、たくさんの写真を撮った。",
  t:"I went on a trip to Kyoto with my family last week. We visited many temples in three days and took a lot of pictures."}
};
D('ewc-sample').addEventListener('click',function(){
 var k=fmtKey(),s=SAMPLES[k]||SAMPLES[{P2PO:'P2O',P2PS:'2S',P1S:'2S'}[k]||'2O'];
 TA.value=s.t;if(s.topic)ETOP.value=s.topic;if(s.points)EPT.value=s.points;if(s.src&&ESRC)ESRC.value=s.src;if(s.name&&ENAME)ENAME.value=s.name;if(s.words){EMIN.value=s.words[0];EMAX.value=s.words[1];}
 CUR_TID='';onModeChange();meter();run(false);beacon('ui',{k:'sample',fmt:k});
});

/* ---------- 先生用URL（?ewc_exam=…&ewc_grade=…&ewc_fmt=…&ewc_topic=…&ewc_tid=…&ewc_lock=1） ---------- */
var Q=(function(){var o={};try{var s=String(location.search||'').replace(/^\?/,'').split('&');for(var i=0;i<s.length;i++){if(!s[i])continue;var p=s[i].split('='),k=decodeURIComponent(p[0]||'');if(k.indexOf('ewc_')!==0)continue;o[k.slice(4)]=decodeURIComponent(p.slice(1).join('=').replace(/\+/g,' '));}}catch(e){}return o;})();
var TEACH=!!(Q.exam||Q.grade||Q.fmt||Q.topic||Q.tid||Q.src);
function gradeOf(fmt){var g=G();for(var k in g){var l=g[k].formats||[];for(var i=0;i<l.length;i++)if(l[i]===fmt)return k;}return '';}
function setLock(on){
 EX.disabled=EG.disabled=ET.disabled=on;ETOP.readOnly=on;EPT.readOnly=on;if(ESRC)ESRC.readOnly=on;if(ENAME)ENAME.readOnly=on;
 if(Q.words){EMIN.readOnly=on;EMAX.readOnly=on;}
 show('ewc-random',!on);var r=R;if(r)r.classList[on?'add':'remove']('ewc-locked');
}
function renderTeach(){
 var el=D('ewc-teach');if(!el)return;
 var fm=F()[fmtKey()]||{},g=G()[EG.value]||{},parts=[];
 parts.push(EX.value==='practice'?'自由練習':EX.value==='univ'?'大学入試':'英検® '+(g.label||''));
 if(EX.value!=='practice')parts.push(TYPE_LABEL[fm.type]||fmtKey());
 var W=wordsRange();if(W)parts.push(W[0]+'〜'+W[1]+'語');
 var h='<b>指定された条件で書きます</b>'+esc(parts.join('　'));
 if(ETOP.value)h+='<br>お題：'+esc(ETOP.value.slice(0,160))+(ETOP.value.length>160?'…':'');
 if(Q.msg)h+='<br>'+esc(String(Q.msg).slice(0,120));
 if(Q.lock==='1')h+='<div class="ewc-teach-act"><span>配布用のURLのため、試験・級・形式・お題は固定されています。</span><button type="button" class="ewc-sub ewc-small" id="ewc-unlock">指定を解除して自由に選ぶ</button></div>';
 el.innerHTML=h;show('ewc-teach',true);
 var ub=D('ewc-unlock');if(ub)ub.addEventListener('click',function(){setLock(false);show('ewc-teach',false);});
}
/* v1.2：英作文テーマ生成メーカーからの受け渡し（?from=theme&prompt=EW-0012）。本文は端末内の et_handoff にだけあり、読んだら直ちに消す */
var HQ=(function(){var o={};try{String(location.search||'').replace(/^\?/,'').split('&').forEach(function(kv){var p=kv.split('=');if(p[0]==='from'||p[0]==='prompt')o[p[0]]=decodeURIComponent(p.slice(1).join('='));});}catch(e){}return o;})();
function makerLink(id,exam){var u=String(ETM.maker||'');if(!u||!/^EW-\d{4}$/.test(id))return '';return u+(u.indexOf('?')>=0?'&':'?')+'et_id='+encodeURIComponent(id)+(exam?'&et_exam='+encodeURIComponent(exam):'')+'#model';}
function applyHandoff(){
 if(HQ.from!=='theme'||!/^EW-\d{4}$/.test(HQ.prompt||''))return false;
 var raw=null;try{raw=localStorage.getItem('et_handoff');localStorage.removeItem('et_handoff');}catch(e){}
 var h=null;try{h=raw?JSON.parse(raw):null;}catch(e){h=null;}
 var now=Date.now(),ok=!!(h&&h.v===1&&String(h.id)===HQ.prompt&&typeof h.t==='number'&&now-h.t<=600000&&h.t-now<60000&&typeof h.text==='string'&&h.text.length<=5000);
 loadTopics().then(function(list){
  var hit=null,alt=null;for(var i=0;i<list.length;i++){if(list[i].id!==HQ.prompt)continue;alt=alt||list[i];if(ok&&list[i].exam===h.exam){hit=list[i];break;}}
  hit=hit||alt;
  if(!hit){setStatus('お題 '+HQ.prompt+' が見つかりませんでした。');if(ok){TA.value=h.text;meter();}return;}
  var gk=gradeOf(hit.format);EX.value=gk==='univ'?'univ':'eiken';fillSelects();if(gk&&gk!=='univ'){EG.value=gk;fillSelects();}
  for(var j=0;j<ET.options.length;j++)if(ET.options[j].value===hit.format)ET.value=hit.format;
  onModeChange();setTopic(hit);
  var el=D('ewc-teach'),lk=makerLink(hit.id,hit.exam);
  if(el){el.innerHTML='<b>英作文テーマ生成メーカーから届いたお題です（'+esc(hit.id)+'）</b>'+(ok?'書いた英文を受け取り、そのままチェックしました。':'下書きの受け渡し期限（10分）が切れていたので、お題だけを入れました。英文を貼りつけてチェックしてください。')+(lk&&hit.model?'<br><a href="'+esc(lk)+'">このお題の模範解答を見る →</a>':'');show('ewc-teach',true);}
  if(ok){TA.value=h.text;meter();saveDraft();run(false);}
  beacon('ui',{k:'handoff',fmt:hit.format});
 })['catch'](function(){setStatus('お題を読み込めませんでした。');if(ok){TA.value=h.text;meter();}});
 return true;
}
function applyQuery(){
 if(!TEACH)return false;
 var g=G(),fmt=(Q.fmt&&/^[A-Z0-9]{2,4}$/.test(Q.fmt))?Q.fmt:'';
 if(Q.exam&&/^(eiken|univ|practice)$/.test(Q.exam))EX.value=Q.exam;
 if(fmt){var gk=gradeOf(fmt);if(fmt==='FR')EX.value='practice';else if(gk==='univ')EX.value='univ';else if(gk)EX.value='eiken';}
 fillSelects();
 var gr=Q.grade&&g[Q.grade]?Q.grade:(fmt?gradeOf(fmt):'');
 if(gr&&EX.value!=='practice'){EG.value=gr;fillSelects();}
 if(fmt){for(var i=0;i<ET.options.length;i++)if(ET.options[i].value===fmt&&!ET.options[i].disabled)ET.value=fmt;}
 onModeChange();
 if(Q.topic)ETOP.value=String(Q.topic).slice(0,400);
 if(Q.points)EPT.value=String(Q.points).slice(0,120);
 if(Q.words&&/^\d{1,4}-\d{1,4}$/.test(Q.words)){var w=Q.words.split('-');if(parseInt(w[1],10)>=parseInt(w[0],10)){EMIN.value=w[0];EMAX.value=w[1];}}
 if(Q.name&&ENAME)ENAME.value=String(Q.name).slice(0,40);
 if(Q.src&&ESRC)ESRC.value=String(Q.src).slice(0,1500);
 CUR_TID='';onModeChange();
 if(Q.tid&&/^[A-Z0-9]+-\d+$/.test(Q.tid)){loadTopics().then(function(list){for(var i=0;i<list.length;i++)if(topicMatch(list[i],Q.tid)&&list[i].format===fmtKey()){setTopic(list[i]);renderTeach();break;}})['catch'](function(){});}
 if(Q.lock==='1')setLock(true);
 renderTeach();
 /* 下書きは、同じ形式・同じお題のものだけ本文を戻す */
 var d=LS.g('wc_draft',null);if(d&&d.t&&d.f===ET.value&&(d.topic||'')===(ETOP.value||'')&&Date.now()-(d.at||0)<7*864e5)TA.value=d.t;
 return true;
}
function shareUrl(){
 var p=[],add=function(k,v){if(v!==''&&v!=null)p.push('ewc_'+k+'='+encodeURIComponent(String(v)));};
 add('exam',EX.value);if(EX.value==='eiken')add('grade',EG.value);if(EX.value!=='practice')add('fmt',ET.value);
 var srcOn=!D('ewc-f-src').classList.contains('ewc-hide');
 if(CUR_TID)add('tid',CUR_TID);
 else{if(ETOP.value)add('topic',ETOP.value.slice(0,400));if(EPT.value)add('points',EPT.value.slice(0,120));if(srcOn&&ESRC&&ESRC.value&&ESRC.value.length<=1200)add('src',ESRC.value);if(srcOn&&ENAME&&ENAME.value)add('name',ENAME.value.slice(0,40));}
 if(EMIN.value&&EMAX.value)add('words',parseInt(EMIN.value,10)+'-'+parseInt(EMAX.value,10));
 add('lock','1');
 return location.href.split('#')[0].split('?')[0]+'?'+p.join('&');
}
D('ewc-share').addEventListener('click',function(){
 var u=shareUrl(),b=this,ok=function(){var o=b.textContent;b.textContent='URLをコピーしました';setTimeout(function(){b.textContent=o;},1800);};
 if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(u).then(ok,function(){window.prompt('この URL を配ってください',u);});else window.prompt('この URL を配ってください',u);
 beacon('ui',{k:'share',fmt:fmtKey()});
});

/* ---------- 印刷・PDF保存（A4 1枚：点数・重大と注意の指摘・本文・名前欄・先生のコメント欄） ---------- */
var PRINT_CSS='@page{size:A4;margin:12mm 13mm}body{font-family:-apple-system,BlinkMacSystemFont,"Hiragino Sans","Noto Sans JP","Helvetica Neue",Arial,sans-serif;color:#000;margin:0;font-size:10.5pt;line-height:1.5;-webkit-print-color-adjust:exact;print-color-adjust:exact}'
 +'.hd{display:flex;justify-content:space-between;align-items:flex-end;gap:10px;border-bottom:2px solid #000;padding-bottom:4px}.hd h1{font-size:16pt;margin:0;font-family:"Yu Mincho","YuMincho","Hiragino Mincho ProN",serif;letter-spacing:.06em}.hd .meta{font-size:9.5pt;text-align:right;line-height:1.4}'
 +'.name{display:flex;gap:18px;align-items:flex-end;font-size:10pt;margin:7px 0 5px;flex-wrap:wrap}.name span{display:inline-block;border-bottom:1px solid #000;min-width:52mm;height:7mm}.name em{font-style:normal;font-size:9pt}'
 +'.grid{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:5px 0}.box{border:1px solid #000;border-radius:3px;padding:4px 7px 5px;break-inside:avoid}.box h2{font-size:9pt;margin:0 0 3px;letter-spacing:.08em;color:#333}'
 +'.ax div{display:grid;grid-template-columns:34px 1fr 44px;gap:6px;align-items:center;font-size:10pt;margin:2px 0}.ax i{display:block;height:6px;background:#ddd}.ax i u{display:block;height:100%;background:#000}.ax b{text-align:right;font-variant-numeric:tabular-nums}'
 +'.cnt{display:flex;gap:12px;font-size:9.5pt;margin:2px 0 3px}.cnt b{font-size:13pt}.topic{font-size:9.5pt;color:#222;margin:0}'
 +'.text{font-family:Georgia,"Times New Roman",serif;font-size:11.5pt;line-height:1.7;white-space:pre-wrap;word-break:break-word;margin:2px 0 0}.text mark{background:none;color:inherit;border-bottom:2px solid #000;padding:0;border-radius:0}.text mark.m2{border-bottom:2px dotted #000}.text mark.wide{border-bottom:0;background:#eee}'
 +'ol{margin:0;padding:0;list-style:none;columns:2;column-gap:7mm;font-size:9.4pt}li{break-inside:avoid;margin:0 0 3px;padding:0 0 2px;border-bottom:1px dotted #bbb}li b{font-size:7.2pt;border:1px solid #000;padding:0 3px;margin-right:4px;vertical-align:1px}li.s3 b{background:#000;color:#fff}li strong{font-weight:700}li span{display:block;color:#333}li code{display:block;font-family:Menlo,Consolas,monospace;font-size:8.6pt;color:#000}'
 +'.cmt{border:1px solid #000;border-radius:3px;height:46mm;margin-top:6px;padding:3px 7px;font-size:8.5pt;color:#333}.ft{font-size:7.8pt;color:#444;margin-top:5px;border-top:1px solid #999;padding-top:3px;line-height:1.4}';
function printHtml(){
 if(!LAST)return '';
 var o=LAST.opt||{},fm=F()[o.format]||{},g=G()[EG.value]||{},W=wordsRange(),i;
 var head=(EX.value==='practice'?'自由練習':EX.value==='univ'?'大学入試':'英検® '+(g.label||''))+(EX.value!=='practice'?'　'+(TYPE_LABEL[fm.type]||o.format):'');
 var d=new Date(),date=d.getFullYear()+'年'+(d.getMonth()+1)+'月'+d.getDate()+'日';
 var items=LAST.findings.filter(function(f){return f.sev>=2;}).sort(function(a,b){return b.sev-a.sev;});
 var c3=LAST.findings.filter(function(f){return f.sev===3;}).length,c2=LAST.findings.filter(function(f){return f.sev===2;}).length,c1=LAST.findings.filter(function(f){return f.sev===1;}).length;
 var li='';for(i=0;i<items.length&&i<14;i++){var f=items[i],hs=f.hits.filter(function(x){return x.t;}).slice(0,3).map(function(x){return esc(x.t)+(x.fix!=null&&x.fix!==x.t?' → '+esc(x.fix===''?'（削除）':x.fix):(x.good?' → '+esc(x.good):''));});
  li+='<li class="s'+f.sev+'"><b>'+SEVN[f.sev]+'</b><strong>'+esc(f.name)+'</strong>'+(f.n>1?'（'+f.n+'か所）':'')+(f.det?'<span>'+esc(f.det)+'</span>':'')+(hs.length?'<code>'+hs.join('　')+'</code>':'')+'</li>';}
 if(items.length>14)li+='<li>ほか'+(items.length-14)+'件</li>';
 if(!items.length)li='<li>重大・注意の指摘はありませんでした。</li>';
 var ax='',ks=['kos','goi','bun'];for(i=0;i<ks.length;i++){var v=LAST.axes[ks[i]];ax+='<div><span>'+AXN[ks[i]]+'</span><i><u style="width:'+(v/4*100)+'%"></u></i><b>'+v+' / 4</b></div>';}
 var hl=buildHL(LAST.text,LAST.hits.filter(function(h){return h.sev>=2;})).replace(/ tabindex="0" role="button" aria-label="指摘を見る"/g,'');
 var topic=ETOP.value?'<p class="topic">お題：'+esc(ETOP.value.slice(0,220))+(ETOP.value.length>220?'…':'')+'</p>':'';
 var html='<!doctype html><html lang="ja"><head><meta charset="utf-8"><title>英作文セルフチェック '+esc(date)+'</title><style>'+PRINT_CSS+'</style></head><body>'
  +'<div class="hd"><h1>英作文セルフチェック</h1><div class="meta">'+esc(date)+'<br>'+esc(head)+'　'+LAST.words+'語'+(W?'（目安 '+W[0]+'〜'+W[1]+'語）':'')+'</div></div>'
  +'<div class="name"><em>名前</em><span></span><em>クラス・番号</em><span style="min-width:30mm"></span></div>'
  +'<div class="grid"><div class="box"><h2>形式チェックの目安（0〜4）</h2><div class="ax">'+ax+'</div></div>'
  +'<div class="box"><h2>指摘の件数</h2><div class="cnt"><span>重大 <b>'+c3+'</b></span><span>注意 <b>'+c2+'</b></span><span>参考 <b>'+c1+'</b></span></div>'+topic+'</div></div>'
  +'<div class="box"><h2>本文（実線＝重大、点線＝注意）</h2><div class="text">'+hl+'</div></div>'
  +'<div class="box" style="margin-top:6px"><h2>指摘（重大・注意）</h2><ol>'+li+'</ol></div>'
  +'<div class="cmt">先生のコメント</div>'
  +'<div class="ft">このチェックは形式・文法・語彙の基本ミスだけを機械的に見たものです。内容の良し悪しや表現の自然さは判定しておらず、英検®のスコアを推定するものではありません。英検®は公益財団法人 日本英語検定協会の登録商標です。　文系ラボ 英作文セルフチェッカー v'+esc(CF.ver||'')+'</div>'
  +'</body></html>';
 return html;
}
function doPrint(){
 var html=printHtml();if(!html){setStatus('先にチェックを実行してください。');return;}
 var w=null;try{w=window.open('','_blank');}catch(e){w=null;}
 if(w&&w.document){try{w.document.open();w.document.write(html);w.document.close();w.focus();setTimeout(function(){try{w.print();}catch(e){}},500);}catch(e){w=null;}}
 if(!w){var fr=document.createElement('iframe');fr.setAttribute('aria-hidden','true');fr.style.cssText='position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden';document.body.appendChild(fr);
  var doc=fr.contentWindow.document;doc.open();doc.write(html);doc.close();
  setTimeout(function(){try{fr.contentWindow.focus();fr.contentWindow.print();}catch(e){}setTimeout(function(){if(fr.parentNode)fr.parentNode.removeChild(fr);},60000);},500);}
 beacon('ui',{k:'print',fmt:LAST.opt?LAST.opt.format:''});
}
var PB=D('ewc-print');if(PB)PB.addEventListener('click',doPrint);

/* ---------- 起動 ---------- */
(function init(){
 var sh=CF.show||{};
 fillSelects();
 if(CF['default']){if(CF['default'].exam)EX.value=CF['default'].exam;if(CF['default'].grade)EG.value=CF['default'].grade;fillSelects();if(CF['default'].format){for(var i=0;i<ET.options.length;i++)if(ET.options[i].value===CF['default'].format&&!ET.options[i].disabled)ET.value=CF['default'].format;}}
 if(!applyHandoff()&&!applyQuery())restoreDraft();
 onModeChange();meter();renderHist();
 if(sh.hist===0){var eh=D('ewc-sec-hist');if(eh)eh.parentNode.removeChild(eh);}
 if(sh.share!==0)show('ewc-share',true);
 if(sh.print===0&&PB)PB.parentNode.removeChild(PB);
 var fl=D('ewc-footlink');if(fl){var ft=CF.foot||{};fl.innerHTML=(ft.u?'<a href="'+esc(ft.u)+'">'+esc(ft.t||ft.u)+'</a><br>':'')+'<small>英検®は、公益財団法人 日本英語検定協会の登録商標です。このツールは同協会とは関係がなく、公式の採点・スコアを示すものではありません。</small>';}
 /* ルール定義は先読みしておく（軽い JSON のみ。品詞ライブラリは初回チェック時） */
 if(window.requestIdleCallback)requestIdleCallback(function(){loadData()['catch'](function(){});});else setTimeout(function(){loadData()['catch'](function(){});},1500);
})();

/* ---------- 自己テスト（コンソールで EWC.selfTest() / EWC.runCases()） ---------- */
function selfTest(){return loadData().then(function(){var r=EWC_RUNNER.selfTest(ENG,DATA.rules);console.log(EWC_RUNNER.summarize(r));if(console.table)console.table(r.rows.filter(function(x){return x.result==='NG';}));return r;});}
function runCases(list){
 var p=list?Promise.resolve(list):fetch(dataUrl('ewc-tests-v'+(CF.vfile||'1-0')+'.json')).then(function(r){return r.json();});
 return Promise.all([loadData(),p]).then(function(a){var r=EWC_RUNNER.runCases(ENG,a[1]);console.log(EWC_RUNNER.summarize(r));if(console.table)console.table(r.table.map(function(x){return {rule:x.rule,sev:x.sev,TP:x.tp,FP:x.fp,FN:x.fn,precision:x.precision,recall:x.recall,ok:x.ok};}));return r;});
}
window.EWC={selfTest:selfTest,runCases:runCases,check:function(t,o){return loadData().then(function(){return ENG.check(t,o||opts());});},get engine(){return ENG;},ver:CF.ver,shareUrl:shareUrl,printHtml:printHtml,query:Q};
})();</script></div></p>



<p class="wp-block-paragraph"><small><small class="mininote">英検®は、公益財団法人 日本英語検定協会の登録商標です。このツールは同協会とは関係がなく、協会の承認や監修を受けたものではありません。</small></small></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0778-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/uguis-ai/">【レビュー】添削が無限？話題のUGUIS.AIが英検・大学入試の英作文対策に最強な理由【限定クーポン付き】</a>
											</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/09/Gemini_Generated_Image_l2hq89l2hq89l2hq-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/eisakubun-tensaku/">英作文の添削はどれを選ぶべき？｜AI・アプリ・塾を目的別に比較</a>
						<span class="p-blogCard__excerpt">英作文の添削には、AI・アプリ・塾・通信添削と複数の手段があります。どれを選ぶべきかは、何を直してほしいかで決まります。 文法の誤りを消したいのか、内容や構成ま&#8230;</span>					</div>
				</div>
			</div>
		</div>


<h2 class="wp-block-heading">このツールでできること</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="426" src="https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0761.jpeg" alt="" class="wp-image-3213" srcset="https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0761.jpeg 780w, https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0761-500x273.jpeg 500w, https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0761-300x164.jpeg 300w, https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0761-768x419.jpeg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<h3 class="wp-block-heading">51項目の基本ミスを、本文に色で示す</h3>



<p class="wp-block-paragraph">語数、構成の形、文法、つづり、語彙の使い方まで、51項目をまとめて確認しています。</p>



<p class="wp-block-paragraph">見つかったミスは本文に下線で示され、<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">重大（赤）</mark>・<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-04-color">注意（オレンジ）</mark>・<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-02-color">参考（青）</mark></strong>の3段階で色分けされます。</p>



<p class="wp-block-paragraph">下線を押すと説明のカードが開き、カードを押すと本文の該当箇所が光るので、どこを直せばいいのか迷いません。</p>



<h3 class="wp-block-heading">直し方をワンタップで反映し、すぐに再チェック</h3>



<p class="wp-block-paragraph">「informations → information」「I am agree → I agree」のように直し方が決まっているミスには、<strong>「この修正を適用」ボタン</strong>が付きます。</p>



<p class="wp-block-paragraph">押すと本文が書き換わり、その場で再チェックされます。「元に戻す」でいつでも取り消せます。</p>



<p class="wp-block-paragraph">各カードには「なぜ減点されるのか」の説明と、正しい例文も付けています。</p>



<h3 class="wp-block-heading">英検®3級〜準1級の全形式と大学入試に対応</h3>



<p class="wp-block-paragraph">級と問題形式を選ぶと、<strong>語数の目安と見る項目が自動で切り替わります</strong>。</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">2024年度から加わったEメールと要約、2025年度に始まった準2級プラスにも対応しています</span></strong>。</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">大学入試の自由英作文は、志望校の語数指定を自分で入力できます。</span></strong></p>



<h3 class="wp-block-heading">要約の「丸写し」と「意見の混入」がわかる</h3>



<p class="wp-block-paragraph">要約問題では、原文を貼っておくと<strong><span class="swl-marker mark_orange">原文と4語以上続けて同じになっている部分を点線で示し、一致率を％で出します。</span></strong></p>



<p class="wp-block-paragraph">要約に「I think」などの自分の意見が混ざっていないかも確認します。要約の練習でよくある失敗を、書いた直後に見つけられます。</p>



<h3 class="wp-block-heading">観点ごとの目安と、これまでの記録</h3>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">構成・語彙・文法の3観点を0〜4の目安で表示します。</span></strong></p>



<p class="wp-block-paragraph">直して出し直すと前回との差が出るので、ミスが減っていく様子がそのまま見えます。記録はお使いの端末に30回分まで残ります。</p>



<h3 class="wp-block-heading">登録も回数制限もなし</h3>



<p class="wp-block-paragraph">チェックはすべてお使いのブラウザの中で行います。<strong>書いた英文やお題は、サーバーに送信されずご自身の端末でのみ閲覧できます</strong>。</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_orange">会員登録もログインも不要で、1日に使える回数の制限もありません。</span></strong></p>



<p class="is-style-icon_good wp-block-paragraph">直してはかけ直す、を好きなだけ繰り返せます。</p>



<h2 class="wp-block-heading">使い方は3ステップ</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="439" src="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-21.jpg" alt="" class="wp-image-2535" srcset="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-21.jpg 780w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-21-500x281.jpg 500w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-21-300x169.jpg 300w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-21-768x432.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<ol class="wp-block-list is-style-num_circle -list-under-dashed">
<li><strong>試験・級・問題形式を選ぶ</strong>……英検®なら級と形式（意見論述／Eメール／要約）、大学入試なら自由英作文か和文英訳を選びます。語数の目安が自動で表示されます。<br>お題や原文があれば入力しておくと、判定が細かくなります。練習用のお題がほしいときは「お題をランダムに出す」を押してください。</li>



<li><strong>英文を書く・貼りつける</strong>……入力中も語数がリアルタイムで出て、範囲内なら緑、はみ出すと赤に変わります。ブラウザの自動修正は切ってあるので、自分の書いたとおりに判定されます。</li>



<li><strong>「チェックする」を押して直す</strong>……重大の指摘から順に直します。直し方が決まっているものは「この修正を適用」を押すだけです。直したらもう一度チェックして、重大がゼロになるまで繰り返します。</li>
</ol>



<p class="is-style-big_icon_point wp-block-paragraph">目安時間どおりに書く練習をしたい人は、語数表示の横の「タイマー」を使ってください。書きかけの英文は端末に自動で保存され、ページを閉じても7日間は復元されます。</p>



<h2 class="wp-block-heading">英検®ライティングの語数一覧（2025年度以降）</h2>



<p class="is-style-big_icon_memo wp-block-paragraph">英検®のライティングは、2024年度から3級・準2級にEメール、2級・準1級に要約が加わり、2025年度には準2級プラスが新設されました。<strong>級と形式ごとの語数の目安</strong>は次のとおりです。<br>このツールも、この範囲で語数を判定しています。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">級</th><th class="has-text-align-left" data-align="left">問題形式</th><th class="has-text-align-left" data-align="left">語数の目安</th><th class="has-text-align-left" data-align="left">押さえたい条件</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">3級</td><td class="has-text-align-left" data-align="left">Eメール</td><td class="has-text-align-left" data-align="left">15〜25語</td><td class="has-text-align-left" data-align="left">相手の質問2つに答える</td></tr><tr><td class="has-text-align-left" data-align="left">3級</td><td class="has-text-align-left" data-align="left">意見論述</td><td class="has-text-align-left" data-align="left">25〜35語</td><td class="has-text-align-left" data-align="left">意見と理由2つ</td></tr><tr><td class="has-text-align-left" data-align="left">準2級</td><td class="has-text-align-left" data-align="left">Eメール</td><td class="has-text-align-left" data-align="left">40〜50語</td><td class="has-text-align-left" data-align="left">下線部について質問を2つ書く</td></tr><tr><td class="has-text-align-left" data-align="left">準2級</td><td class="has-text-align-left" data-align="left">意見論述</td><td class="has-text-align-left" data-align="left">50〜60語</td><td class="has-text-align-left" data-align="left">意見と理由2つ</td></tr><tr><td class="has-text-align-left" data-align="left">準2級プラス</td><td class="has-text-align-left" data-align="left">要約</td><td class="has-text-align-left" data-align="left">25〜35語</td><td class="has-text-align-left" data-align="left">原文の要点を自分の言葉で</td></tr><tr><td class="has-text-align-left" data-align="left">準2級プラス</td><td class="has-text-align-left" data-align="left">意見論述</td><td class="has-text-align-left" data-align="left">50〜60語</td><td class="has-text-align-left" data-align="left">意見と理由2つ</td></tr><tr><td class="has-text-align-left" data-align="left">2級</td><td class="has-text-align-left" data-align="left">要約</td><td class="has-text-align-left" data-align="left">45〜55語</td><td class="has-text-align-left" data-align="left">原文の要点を自分の言葉で</td></tr><tr><td class="has-text-align-left" data-align="left">2級</td><td class="has-text-align-left" data-align="left">意見論述</td><td class="has-text-align-left" data-align="left">80〜100語</td><td class="has-text-align-left" data-align="left">POINTS は参考。意見と理由2つ</td></tr><tr><td class="has-text-align-left" data-align="left">準1級</td><td class="has-text-align-left" data-align="left">要約</td><td class="has-text-align-left" data-align="left">60〜70語</td><td class="has-text-align-left" data-align="left">原文の要点を自分の言葉で</td></tr><tr><td class="has-text-align-left" data-align="left">準1級</td><td class="has-text-align-left" data-align="left">意見論述</td><td class="has-text-align-left" data-align="left">120〜150語</td><td class="has-text-align-left" data-align="left">POINTS から2つを使う。序論・本論・結論</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><small class="mininote">出典：公益財団法人 日本英語検定協会が公開している2025年度第2回の問題冊子、および2025年4月15日の協会のお知らせ。</small></p>



<p class="is-style-big_icon_check wp-block-paragraph">語数は「目安」ですが、範囲から大きく外れると評価が下がるおそれがあります。特に<strong>少なすぎる答案は、内容が足りないと見なされやすい</strong>ので、<strong><span class="swl-marker mark_yellow">下限を必ず超えるようにしましょう。</span></strong></p>



<h3 class="wp-block-heading">このツールの語数の数え方</h3>



<p class="is-style-icon_book wp-block-paragraph">このツールでは次のように数えています。英検®の公式な数え方ではないので、本番で語数がぎりぎりになりそうなときは、範囲の真ん中を目指して書くのをおすすめします。</p>



<p class="wp-block-paragraph">英検®を独学で受けるなら、間に合うかを過去問1回分で判定する方法と、級別の進め方をこちらにまとめています。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/10/Gemini_Generated_Image_p2sp98p2sp98p2sp-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/eiken-dokugaku/">英検®は独学で間に合う？過去問1回分でわかる判定法と級別の勉強法【3級〜準1級】</a>
											</div>
				</div>
			</div>
		</div>


<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>空白で区切られたまとまりを1語と数えます。</li>



<li>短縮形（don&#8217;t）、ハイフンでつないだ語（well-known）、数字（2024、20%）は、それぞれ1語です。</li>



<li>コンマやピリオドなど、記号だけのものは数えません。</li>



<li>Eメール問題で、解答用紙にもともと印刷されている挨拶（Hi, ◯◯! Thank you for your e-mail.）と結び（Best wishes,）は数えません。</li>
</ul>



<p class="wp-block-paragraph"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4731187550371076"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-4731187550371076"
     data-ad-slot="9318171025"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading">問題形式ごとに、ツールが見ているところ</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="408" src="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-7.jpg" alt="" class="wp-image-2360" srcset="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-7.jpg 780w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-7-500x262.jpg 500w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-7-300x157.jpg 300w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-7-768x402.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<h3 class="wp-block-heading">意見論述（3級〜準1級）</h3>



<p class="wp-block-paragraph">最初の文で<strong>自分の立場（I agree / I think など）</strong>をはっきり示しているか、<strong>理由を示す目印（First / Second / Also など）が2つ</strong>あるか、最後に結論の文があるかを確認しています。</p>



<p class="wp-block-paragraph">2級・準1級では POINTS の語を使っているかも見ます。準1級では、POINTS から2つを使っているか、序論・本論・結論の段落に分かれているかまで確認しています。</p>



<h3 class="wp-block-heading">Eメール（3級・準2級）</h3>



<p class="wp-block-paragraph">解答用紙に印刷済みの挨拶や結びを書き写していないかを確認し、書いていればその分を語数から除きます。</p>



<p class="wp-block-paragraph">準2級では、<strong>疑問文が2つあるか</strong>を数えます。3級では、相手のメールを貼っておくと、質問に答えているかの目安を出します。</p>



<h3 class="wp-block-heading">要約（準2級プラス・2級・準1級）</h3>



<p class="wp-block-paragraph">原文との一致率（4語以上の連続一致）を出し、原文の文をそのまま写した箇所と、「I think」「In my opinion」などの意見の混入を指摘します。</p>



<p class="wp-block-paragraph"><strong>一致率が30％を超えると注意、50％を超えると重大</strong>として表示します。</p>



<h3 class="wp-block-heading">大学入試の自由英作文</h3>



<p class="wp-block-paragraph">語数は大学ごとに違うので、詳細設定で志望校の指定（例：80〜120語）を入力します。</p>



<p class="wp-block-paragraph">立場の明示、理由、結論に加えて、段落が1つだけになっていないか、一文が長すぎないかも確認しています。</p>



<h3 class="wp-block-heading">大学入試の和文英訳</h3>



<p class="wp-block-paragraph">日本語の原文を貼っておくと、<strong>日本語の文の数と英文の文の数</strong>が対応しているか、原文にある数字（「三日間」「五つ」なども含む）が英文に入っているかを確認しています。</p>



<p class="wp-block-paragraph">訳抜けに気づくきっかけになります。</p>



<h2 class="wp-block-heading">チェックしている51の項目</h2>



<p class="has-border -border04 wp-block-paragraph">項目は大きく6つのグループに分かれています。どの項目も、同じ英文なら必ず同じ結果になるルールで判定しています。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">グループ</th><th class="has-text-align-left" data-align="left">主な項目</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">形式・分量</td><td class="has-text-align-left" data-align="left">語数が範囲外／ぎりぎり、タイトル行を書いている、Eメールで印刷済みの挨拶・結びを書いている、質問が2つない、要約の一致率・丸写し・意見の混入</td></tr><tr><td class="has-text-align-left" data-align="left">構成</td><td class="has-text-align-left" data-align="left">冒頭で立場を示していない、理由の目印が2つない、結論の文がない、POINTS を使っていない、準1級の段落構成</td></tr><tr><td class="has-text-align-left" data-align="left">構成・つなぎ</td><td class="has-text-align-left" data-align="left">接続表現がない、文頭の And / But / So、for example の後に例がない、etc. で文を終える、段落が1つだけ</td></tr><tr><td class="has-text-align-left" data-align="left">文法・表記</td><td class="has-text-align-left" data-align="left">文頭の小文字、I の小文字、文末の句読点、全角文字の混入、三単現の s、a と an、不可算名詞の複数形、主語と動詞の不一致、more better などの二重比較、日本人に多い誤用、文の断片、コンマだけで2文をつなぐ、助動詞の後の形、to 不定詞と動名詞の使い分け、つづりミス、同じ語の連続、it&#8217;s と its など</td></tr><tr><td class="has-text-align-left" data-align="left">語彙・読みやすさ</td><td class="has-text-align-left" data-align="left">口語・くだけた語、a lot of の多用、短縮形、同じ語の繰り返し、語彙の多様性、和製英語、曖昧な語の多用、I で始まる文が多い、長すぎる文、短い文ばかり続く</td></tr><tr><td class="has-text-align-left" data-align="left">和文英訳</td><td class="has-text-align-left" data-align="left">文の数の対応、原文の数字が英文にない</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4731187550371076"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-4731187550371076"
     data-ad-slot="9318171025"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading">英作文でよくあるミスと直し方</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="408" src="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-1.jpg" alt="" class="wp-image-2163" srcset="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-1.jpg 780w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-1-500x262.jpg 500w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-1-300x157.jpg 300w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-1-768x402.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<p class="has-border -border02 wp-block-paragraph">以下では、実際によく出る指摘を、直し方と一緒にまとめました。書く前に一度目を通しておくだけでも、ミスはかなり減ります。</p>



<h3 class="wp-block-heading">①「I am agree」と書いている</h3>



<p class="wp-block-paragraph">agree は「賛成する」という動詞なので、be 動詞は付けません。日本語の「賛成です」に引っぱられて、よく出るミスのひとつです。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>I am agree with this opinion.</p>



<p class="wp-block-paragraph"><strong>○</strong>I agree with this opinion.</p>
</div></div>



<h3 class="wp-block-heading">② 三単現の s が抜けている</h3>



<p class="wp-block-paragraph">主語が he / she / it や単数の名詞で、現在の話をしているときは、動詞に s が付きます。長い文になるほど抜けやすくなります。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>She play tennis after school every day.</p>



<p class="wp-block-paragraph"><strong>○</strong>She plays tennis after school every day.</p>
</div></div>



<p class="is-style-big_icon_point wp-block-paragraph">主語が名詞（My brother、Volunteer work など）の文は、このツールでは見落とすことがあります。自分でも主語と動詞を確かめましょう。</p>



<h3 class="wp-block-heading">③ information や advice を複数形にしている</h3>



<p class="wp-block-paragraph">information、advice、homework、furniture などは数えられない名詞なので、s を付けません。数を言いたいときは a piece of を使います。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>I got many informations from the internet.</p>



<p class="wp-block-paragraph"><strong>○</strong>I got a lot of information from the internet.</p>
</div></div>



<h3 class="wp-block-heading">④「discuss about」「enjoy to」など、動詞の使い方</h3>



<p class="wp-block-paragraph">discuss は後ろにすぐ目的語を置く動詞なので about は不要です。enjoy や finish の後ろは to 不定詞ではなく -ing 形にします。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>We discussed about the problem. I enjoyed to talk with them.</p>



<p class="wp-block-paragraph"><strong>○</strong>We discussed the problem. I enjoyed talking with them.</p>
</div></div>



<h3 class="wp-block-heading">⑤ コンマだけで2つの文をつないでいる</h3>



<p class="wp-block-paragraph">英語では、主語と動詞がそろった文どうしをコンマだけでつなぐのは誤りとされます。ピリオドで区切るか、and や because などの接続詞でつなぎます。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>I like summer, it is my favorite season.</p>



<p class="wp-block-paragraph"><strong>○</strong>I like summer. It is my favorite season.</p>
</div></div>



<h3 class="wp-block-heading">⑥ 文の始まりや「I」が小文字になっている</h3>



<p class="wp-block-paragraph">スマホで下書きをすると起きやすいミスです。文の最初の文字と、「私」を表す I は、いつでも大文字にします。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>for these reasons, i think students should do volunteer work.</p>



<p class="wp-block-paragraph"><strong>○</strong>For these reasons, I think students should do volunteer work.</p>
</div></div>



<h3 class="wp-block-heading">⑦ Eメール問題で、印刷済みの挨拶まで書いている</h3>



<p class="wp-block-paragraph">英検®のEメール問題では、解答用紙に「Hi, ◯◯! Thank you for your e-mail.」と「Best wishes,」がすでに印刷されています。</p>



<p class="is-style-big_icon_caution wp-block-paragraph">自身でも書くと、<strong>その分は内容の語数にならず、本文が足りなくなる</strong>ことがあります。本文だけを書きましょう。</p>



<h3 class="wp-block-heading">⑧ 要約で、原文をそのまま写したり自分の意見を入れたりしている</h3>



<p class="wp-block-paragraph">要約は「原文の内容を、自分の言葉で短くまとめる」問題です。原文の文をそのまま使うと言い換えの力が見せられず、「I think」などで意見を加えると要約ではなくなります。<strong>名詞を動詞に言い換える、具体例をまとめて一般的な語にする</strong>のが言い換えのコツです。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>×</strong>However, some parents are worried. I think tablets are useful.</p>



<p class="wp-block-paragraph"><strong>○</strong>However, some parents worry that students spend too much time on screens.</p>
</div></div>



<h2 class="wp-block-heading">このツールにできないこと</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="439" src="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-18.jpg" alt="" class="wp-image-2529" srcset="https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-18.jpg 780w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-18-500x281.jpg 500w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-18-300x169.jpg 300w, https://lawcityblog.com/wp-content/uploads/2023/02/My-project-1-18-768x432.jpg 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<p class="wp-block-paragraph">このツールが見ているのは、<strong><span class="swl-marker mark_yellow">形式・文法・語彙の基本ミスだけ</span></strong>です。次のことは判定していません。</p>



<ul class="wp-block-list is-style-bad_list -list-under-dashed">
<li><strong>内容の良し悪し</strong>……理由に説得力があるか、お題に正面から答えているかは判定しません。</li>



<li><strong>論理のつながり</strong>……理由と結論が矛盾していないか、例が理由を支えているかは見ていません。</li>



<li><strong>表現の自然さ</strong>……文法的に正しくても不自然な言い回しは、指摘できないことがあります。</li>



<li><strong>英検®のスコア</strong>……観点の目安は表示しますが、英検®の点数や CSE スコアは推定しません。</li>
</ul>



<p class="wp-block-paragraph">つまり「重大の指摘がゼロ」は、<strong>基本ミスで落とす心配が減った</strong>という意味で、高得点が取れるという意味ではありません。</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_blue">基本ミスを直し終えたら、内容と構成を人やAIに見てもらう</span></strong>のが次の一歩です。</p>



<p class="wp-block-paragraph">内容まで採点してほしい人には、英検®ライティングと大学入試の英作文をAIが4観点（語彙・文法・内容・構成）で採点する&nbsp;<a href="https://uguis.ai/?utm_source=bunkeilab&amp;utm_medium=article&amp;utm_campaign=ewc&amp;utm_content=article_cannot" target="_blank" rel="noopener">UGUIS.AI</a>&nbsp;があります。紙に書いた答案をカメラで読み込むこともできます。料金や使い勝手は<a href="https://lawcityblog.com/uguis-ai/">UGUIS.AI のレビュー記事</a>にまとめています。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0778-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/uguis-ai/">【レビュー】添削が無限？話題のUGUIS.AIが英検・大学入試の英作文対策に最強な理由【限定クーポン付き】</a>
											</div>
				</div>
			</div>
		</div>


<h2 class="wp-block-heading">先生・塾の方へ：条件を固定したURLと印刷</h2>



<p class="wp-block-paragraph">生徒に同じ条件で練習させたいときは、<strong><span class="swl-marker mark_yellow">ツールで試験・級・形式・お題を選んでから「この条件のURLをコピー」を押してください。</span></strong></p>



<p class="wp-block-paragraph"><strong>条件とお題が固定されたURL</strong>ができるので、それを配るだけで全員が同じ問題で書けます。要約やEメールの原文も、そのURLにまとめて入ります。</p>



<p class="wp-block-paragraph">結果画面の「印刷・PDF保存」を押すと、<strong>名前欄と先生のコメント欄が付いたA4用紙1枚</strong>に、観点の目安、指摘、本文がまとまります。提出前チェックの記録として回収したり、添削のときの下敷きにしたりできます。</p>



<p class="wp-block-paragraph">生徒の英文はサーバーに送られないので、個人情報や答案の扱いを気にせずに使えます。</p>



<h2 class="wp-block-heading">よくある質問</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="780" height="426" src="https://lawcityblog.com/wp-content/uploads/2026/09/image-331.png" alt="Q&amp;A" class="wp-image-5855" srcset="https://lawcityblog.com/wp-content/uploads/2026/09/image-331.png 780w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-300x163.png 300w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-498x272.png 498w, https://lawcityblog.com/wp-content/uploads/2026/09/image-331-768x419.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<dl class="swell-block-faq -icon-rounded" data-q="fill-custom" data-a="fill-main">
<div class="swell-block-faq__item"><dt class="faq_q">書いた英文はどこかに送信されますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">送信されません。<br>チェックはすべてお使いのブラウザの中で行います。ツール改善のため、試験・級・形式、点数の目安、どの項目の指摘が出たかだけを匿名で記録していますが、<strong>英文・お題・原文は一切送りません</strong>。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">料金や会員登録は必要ですか？ 回数の制限はありますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">無料で、登録もログインも不要です。1日に使える回数の制限もありません。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">このツールは、AI（ChatGPT など）で添削しているのですか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">いいえ。<br>外部のAIは使わず、文法のルールと辞書で判定しています。そのため、<strong>同じ英文なら何度かけても同じ結果</strong>になります。反対に、内容や表現の自然さといった、ルールで決められないことは判定しません。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">英検®のスコアや合否はわかりますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">わかりません。<br>英検®の点数や CSE スコアは推定しません。観点ごとの0〜4は、基本ミスの多さをもとにした目安です。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">語数の数え方は、英検®と同じですか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">同じとは限りません。<br>このツールは「空白で区切ったまとまりを1語、記号は数えない」という一般的な数え方をしています（英検®の公式な数え方ではありません）。本番で語数がぎりぎりになりそうなときは、範囲の真ん中を目指して書くのが安全です。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">大学入試の自由英作文で、語数の指定が違うときは？</dt><dd class="faq_a">
<p class="wp-block-paragraph">試験で「大学入試」「自由英作文」を選び、「詳細設定」を開いて志望校の語数（例：100〜120語）を入力してください。その範囲で判定します。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">指摘が間違っていると思ったら？</dt><dd class="faq_a">
<p class="wp-block-paragraph">指摘カードの「この指摘は違う」を押してください。件数を集計して、誤検知が多い項目の判定を見直します。押しても英文は送られません。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">スマホでも使えますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">使えます。スマホの画面幅に合わせて表示が切り替わります。ブラウザの自動修正や自動大文字化は切ってあるので、自分で書いたとおりに判定されます。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">前にチェックした記録や、書きかけの英文は残りますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">チェックの記録は端末に30回分、書きかけの英文は7日間残ります。ほかの人からは見えません。ブラウザの履歴やサイトデータを消すと、あわせて消えます。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">英検®1級には対応していますか？</dt><dd class="faq_a">
<p class="wp-block-paragraph">現在は3級〜準1級と大学入試が対象です。1級の英文でも、試験を「自由練習」にすれば文法と表記のチェックは使えます。</p>
</dd></div>
</dl>
<script type="application/ld+json">{"@context":"https:\/\/schema.org","@id":"#FAQContents","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"書いた英文はどこかに送信されますか？","acceptedAnswer":{"@type":"Answer","text":"<p>送信されません。<br>チェックはすべてお使いのブラウザの中で行います。ツール改善のため、試験・級・形式、点数の目安、どの項目の指摘が出たかだけを匿名で記録していますが、<strong>英文・お題・原文は一切送りません<\/strong>。<\/p>"}},{"@type":"Question","name":"料金や会員登録は必要ですか？ 回数の制限はありますか？","acceptedAnswer":{"@type":"Answer","text":"<p>無料で、登録もログインも不要です。1日に使える回数の制限もありません。<\/p>"}},{"@type":"Question","name":"このツールは、AI（ChatGPT など）で添削しているのですか？","acceptedAnswer":{"@type":"Answer","text":"<p>いいえ。<br>外部のAIは使わず、文法のルールと辞書で判定しています。そのため、<strong>同じ英文なら何度かけても同じ結果<\/strong>になります。反対に、内容や表現の自然さといった、ルールで決められないことは判定しません。<\/p>"}},{"@type":"Question","name":"英検®のスコアや合否はわかりますか？","acceptedAnswer":{"@type":"Answer","text":"<p>わかりません。<br>英検®の点数や CSE スコアは推定しません。観点ごとの0〜4は、基本ミスの多さをもとにした目安です。<\/p>"}},{"@type":"Question","name":"語数の数え方は、英検®と同じですか？","acceptedAnswer":{"@type":"Answer","text":"<p>同じとは限りません。<br>このツールは「空白で区切ったまとまりを1語、記号は数えない」という一般的な数え方をしています（英検®の公式な数え方ではありません）。本番で語数がぎりぎりになりそうなときは、範囲の真ん中を目指して書くのが安全です。<\/p>"}},{"@type":"Question","name":"大学入試の自由英作文で、語数の指定が違うときは？","acceptedAnswer":{"@type":"Answer","text":"<p>試験で「大学入試」「自由英作文」を選び、「詳細設定」を開いて志望校の語数（例：100〜120語）を入力してください。その範囲で判定します。<\/p>"}},{"@type":"Question","name":"指摘が間違っていると思ったら？","acceptedAnswer":{"@type":"Answer","text":"<p>指摘カードの「この指摘は違う」を押してください。件数を集計して、誤検知が多い項目の判定を見直します。押しても英文は送られません。<\/p>"}},{"@type":"Question","name":"スマホでも使えますか？","acceptedAnswer":{"@type":"Answer","text":"<p>使えます。スマホの画面幅に合わせて表示が切り替わります。ブラウザの自動修正や自動大文字化は切ってあるので、自分で書いたとおりに判定されます。<\/p>"}},{"@type":"Question","name":"前にチェックした記録や、書きかけの英文は残りますか？","acceptedAnswer":{"@type":"Answer","text":"<p>チェックの記録は端末に30回分、書きかけの英文は7日間残ります。ほかの人からは見えません。ブラウザの履歴やサイトデータを消すと、あわせて消えます。<\/p>"}},{"@type":"Question","name":"英検®1級には対応していますか？","acceptedAnswer":{"@type":"Answer","text":"<p>現在は3級〜準1級と大学入試が対象です。1級の英文でも、試験を「自由練習」にすれば文法と表記のチェックは使えます。<\/p>"}}]}</script>



<h2 class="wp-block-heading">あわせて使いたいツール・記事</h2>



<p class="wp-block-paragraph">内容や構成を見直したい人は、自由英作文の型と語数別の答案例を確認してください。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/11/Gemini_Generated_Image_euq5cyeuq5cyeuq5-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/jiyu-eisakubun/">自由英作文の書き方｜大学受験で使える型とフレーズ・語数別の答案例</a>
											</div>
				</div>
			</div>
		</div>


<p class="is-style-balloon_box2 wp-block-paragraph"><strong>書くお題がほしい人はこちら。</strong></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/Gemini_Generated_Image_xgl43exgl43exgl4-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-theme-maker/">自由英作文テーマ600題＋英検®お題メーカー【無料】段階ヒント・模範解答つき</a>
											</div>
				</div>
			</div>
		</div>


<p class="is-style-balloon_box2 wp-block-paragraph"><strong>出題されやすいテーマを先に押さえたい人はこちら。</strong></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2021/11/Gemini_Generated_Image_76wnn076wnn076wn-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-composition/">【2027年度入試】自由英作文の頻出テーマ一覧｜AI・移民ほか11分野</a>
											</div>
				</div>
			</div>
		</div>


<p class="is-style-balloon_box2 wp-block-paragraph"><strong>指摘された文法を問題で固めたい人はこちら。</strong></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/08/Gemini_Generated_Image_vfry5pvfry5pvfry-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/eibunpou-maker/">【自動生成・分析】大学受験 英文法1000問演習テスト｜分野・ランク別ツール</a>
											</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0789-500x273.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/high-school-grammar-test/">【無料・高校受験】中学英文法テスト1000問 分野別・ランク別で弱点を完全攻略</a>
											</div>
				</div>
			</div>
		</div>


<p class="is-style-balloon_box2 wp-block-paragraph"><strong>語彙を増やして同じ語の繰り返しを減らしたい人はこちら。</strong></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/Gemini_Generated_Image_41tsxg41tsxg41ts-500x279.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-test-maker/">【自動生成・無料】大学受験　英単語テスト1536語 ４択クイズで実力診断</a>
											</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/02/IMG_0788-500x273.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/high-school-english-test/">【無料・高校受験】中学英単語テスト1000問 入試頻出単語を4択クイズで完全攻略</a>
											</div>
				</div>
			</div>
		</div>


<p class="is-style-balloon_box2 wp-block-paragraph"><strong>基本ミスを直し終えたら、人やAIに内容を見てもらいましょう。</strong></p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://lawcityblog.com/wp-content/uploads/2026/01/IMG_0763-500x262.jpeg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://lawcityblog.com/english-correction/">英作文の添削おすすめ8選【無料あり】AI・アプリ・塾を目的別に比較【2026年】</a>
											</div>
				</div>
			</div>
		</div>]]></content:encoded>
					
					<wfw:commentRss>https://lawcityblog.com/english-writing-checker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
